teoría de lenguajes y compiladores análisis sintáctico descendente semana 8 unidad ii analizador...

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

Upload: rodrigo-segura-molina

Post on 03-Feb-2016

248 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

Teoría de lenguajes y compiladores

Análisis Sintáctico Descendente

Semana 8

Unidad II

Analizador Sintáctico

Page 2: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

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.

Page 3: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

Objetivos Específicos

Diseñar un analizador sintáctico.

Page 4: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

Objetivos Específicos

Aplicar métodos de desarrollo descendente para la construcción

de analizadores sintácticos

Page 5: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

Objetivos Instruccionales

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

Page 6: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico
Page 7: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

ANALIZADOR SINTÁCTICO

Sentencias

SentenciasSentencia ;

Asignación Sentencia

AsignaciónVariable Expresión:=

Variable Expresión:=Variable Expresión+x

b Variable Expresión*

Variable

Variable

c

d

e

y

Page 8: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

Función:•Comprobar que la secuencia de tokens cumple con las reglas de la gramática•Generar el árbol sintáctico

Ventajas de utilizar gramáticas:•Las gramáticas son especificaciones sintácticas y precisas de lenguajes de programación•A partir de una gramática se puede generar automáticamente un analizador•El proceso de construcción puede llevar a descubrir ambigüedades•Una gramática imparte estructura a un lenguaje de programación, siendo mas fácil generar código y detectar errores•Es mas fácil de ampliar/modificar el lenguaje si esta descrito con una gramática

ANALISIS SINTACTICO

Page 9: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

Descendentes (Top-Down): Parten del axioma y aplican las reglas de la gramática hasta llegar a secuencia de símbolos terminales (tokens):

• Analizadores LL(1)• Analizadores recursivos

Ascendentes (Bottom-Up): Parten de las hojas (conjunto de tokens) para llegar a la raíz (axioma de la gramática):

• Analizadores de Precedencia de Operador• Analizadores LR(1)

TIPOS DE ANALIZADORES SINTACTICOS

Page 10: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

• Se basa en gramáticas LL, que construyen árboles de análisis sintáctico de arriba (raíz) hacia 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.

ANALISIS SINTÁCTICO DESCENDENTE

Page 11: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

Algoritmo:•Poner el axioma como raíz del árbol de derivación•Hasta que solo haya símbolos terminales, derivar mas a la izquierda

Ejemplo:Entrada: Id * Id + idGramática: Expresion::= Expresion * Termino | Expresion + Termino | Termino Termino ::= id | NumeroDerivación: Expresion Expresion + Termino Expresion * Termino + Termino Termino * Termino + Termino Id * Termino + Termino Id * Id + Termino Id * Id + id

ANALISIS SINTÁCTICO DESCENDENTE

Page 12: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

• Mas de una opción: A ::= a|β

Retroceso Analizar los siguientes elementos de entrada

• Recursividad izquierda

Eliminación de la recursividad

• Ambigüedad

Factorización por la izquierda

PROBLEMAS DE LOS ANALIZADORES SINTÁCTICO

DESCENDENTE

Page 13: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

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 (CONJUNTO PRIMERO). •El conjunto de todos los símbolos terminales que pueden aparecer después de uno no terminal (CONJUNTO SIGUIENTE).

Page 14: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

Sea G(N,T,P,S) una gramática y α secuencia arbitraria de símbolos, es decir α Є (NUT)*, entonces;

Primero(α) = { t / t Є TЄ ^ α t a‘ } , 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ñádase Є 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ñádase Є 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(1/3)

Page 15: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

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 todo i=1..n, Primero(Xi) contiene al Є.

CONJUNTO PRIMERO(2/3)

Page 16: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

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 PRIMERO(3/3)

Page 17: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

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(1/2)

Page 18: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

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’

CONJUNTO SIGUIENTE(2/2)

Page 19: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

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 las producciones de la forma:A α1 | α2 | α3 | … | αn

se requiere: Primero(αi) ∩ Primero(αj) = Ø 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)

Page 20: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

Ejemplo:GRAMÁTICAS LL(1)

Considerar una gramática que permita la generación de frases como: program declaracion; declaracion; begin proposicion; proposicion; 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 de tipo LL(1)?

p = programad = declaracionb = begins = proposicione = end

Page 21: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

Solución:

GRAMÁTICAS LL(1)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. 

Page 22: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

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 GSalida: La tabla de análisis sintáctico M Método:1. Para cada producción A α de la gramática dense los pasos 2 y 3.2. Para cada terminal “a” de primero(α) , añádase A α a M[A,a]3.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 LL(1)(1/2)

Page 23: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

En la gramática anterior:

 

NoTerminal

Símbolo de entrada

id + * ( ) $

E E T E’     E T E’

   

E’   E’ +TE’     E’ Є E’ Є

T T F T’     T F T’    

T’   T’ Є T’ *FT’   T’ Є T’ Є

F F id     F ( E )    

   

CONSTRUCCIÓN DE TABLAS LL(1)(2/2)

Page 24: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

Algoritmo:Entrada: Una cadena W y una tabla de análisis sintáctico M para la gramática GSalida: Si W esta en L(G) , una derivación por la izquierda de W; de lo contrario una indicación de error.

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.

1. Apuntar ptr al primer símbolo de W$2. 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” Caso contrario Si M[X,a] = X Y1Y2…Yk entonces 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

Caso contrario “Error “ Hasta X = $ /* la pila esta vacía */

ALGORITMO REGURSIVO GUIADO POR TABLA (1/2)

Page 25: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

Ejemplo:  Analizar si: id + id * id es valida para la gramática anteriormente presentada.PILA ENTRADA SALIDA

$E id + id * id $  

$E’T id + id * id $ E TE’

$E’T’F id + id * id $ T FT’

$E’T’id id + id * id $ F id

$E’T’ + id * id $  

$E’ + id * id $ T’ Є

$E’T+ + id * id $ E’ +TE’

$E’T id * id $  

$E’T’F id * id $ T FT’

$E’T’id id * id $ F id

$E’T’ * id $  

$E’T’F* * id $ T’ *FT’

$E’T’F id $  

$E’T’id id $ F id

$E’T’ $  

$E’ $ T’ Є

$ $ E’ Є

ALGORITMO REGURSIVO GUIADO POR TABLA (2/2)

Page 26: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

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

Page 27: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

Ejemplo:

E ::= T E’E’ ::= + T E’ | ЄT ::= F T’T’ ::= * F T’ | ЄF ::= (E) | Id

ESTRUCTURA DE UN ANALIZADOR SINTACTICO DESCENDENTE

RECURSIVOProcedure E T; E’; write(“E”)

Procedure E’ c=GetToken; if c = ‘+’ then write(‘+’); T; E’; else rectract; write(“E’”)

Procedure F c=GetToken; case c ‘(‘: write(“(“); E; c=GetToken(); if c = ‘)’ then write(‘)’); write(“F”); else Fail; error; Id: write(“Id”); write(“F”); otherwise: Fail; error;

Page 28: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

PROGRAM Analizador_sintactico; PROCEDURE Error (…); PROCEDURE N0; PROCEDURE N1; … … PROCEDURE Nm;BEGIN Leer_simbolo; N0;END.

ESTRUCTURA DE UN ANALIZADOR SINTACTICO DESCENDENTE

RECURSIVO

Page 29: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

CORRESPONDENCIA ENTRE GRAFOS SINTACTICOS Y LOS PROGRAMAS

s1

s2

sm

REGLA 1: Representación de alternativas.

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;

Page 30: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

CORRESPONDENCIA ENTRE GRAFOS SINTACTICOS Y LOS PROGRAMAS

REGLA 2: Secuencia de llamada a procedimientos.

BEGIN P(S1); P(S2); ….; P(S3) END;

S1 S2 Sn

Page 31: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

CORRESPONDENCIA ENTRE GRAFOS SINTACTICOS Y LOS PROGRAMAS

WHILE ch IN PRIMERO(S) DO P(S);

S

REGLA 3: Proposición de repetición.

Page 32: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

CORRESPONDENCIA ENTRE GRAFOS SINTACTICOS Y LOS PROGRAMAS

IF ch IN PRIMERO(S) THEN P(S);

REGLA 4: Proposición condicional.

S

Page 33: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

CORRESPONDENCIA ENTRE GRAFOS SINTACTICOS Y LOS PROGRAMAS

P(S);

REGLA 5: Llamada a procedimiento

S

Page 34: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

CORRESPONDENCIA ENTRE GRAFOS SINTACTICOS Y LOS PROGRAMAS

REGLA 6: Lectura condicional

S

IF ch = “t” THEN read(ch) ELSE Error;

Page 35: Teoría de lenguajes y compiladores Análisis Sintáctico Descendente Semana 8 Unidad II Analizador Sintáctico

Teoría de lenguajes y compiladores

Análisis Sintáctico Descendente

Semana 8

Unidad II

Analizador Sintáctico