Teoría de lenguajes y compiladores
description
Transcript of Teoría de lenguajes y compiladores
![Page 1: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/1.jpg)
Teoría de lenguajes y compiladores
Unidad I
Analizador Sintáctico
Análisis Sintáctico Descendente
Temas
Semana 8
![Page 2: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/2.jpg)
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](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/3.jpg)
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.
![Page 4: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/4.jpg)
Objetivos Instruccionales
• Aplicar el método descendente para la creación de analizadores sintácticos.
![Page 5: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/5.jpg)
![Page 6: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/6.jpg)
• 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.
ANALIZADOR SINTÁCTICO DESCENDENTE
Ge
ne
ralid
ad
es
![Page 7: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/7.jpg)
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”
Gra
má
tica
s L
L
![Page 8: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/8.jpg)
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(1)G
ram
átic
as
LL
![Page 9: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/9.jpg)
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(2)G
ram
átic
as
LL
![Page 10: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/10.jpg)
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)G
ram
átic
as
LL
![Page 11: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/11.jpg)
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)G
ram
átic
as
LL
![Page 12: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/12.jpg)
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)G
ram
átic
as
LL
![Page 13: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/13.jpg)
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ónA α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)G
ram
átic
as
LL
![Page 14: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/14.jpg)
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 tipo LL(1)?
p = programad = declaracion
b = begins = proposicion
e = end
Gra
má
tica
s L
L
![Page 15: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/15.jpg)
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.
Gra
má
tica
s L
L
![Page 16: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/16.jpg)
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
Est
rate
gia
de
sce
nd
en
te r
ecu
rsiv
a
![Page 17: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/17.jpg)
PROGRAM Analizador_sintactico; PROCEDURE Error (…); PROCEDURE N0; PROCEDURE N1; … … PROCEDURE Nm;BEGIN Leer_simbolo; N0;END.
ESTRUCTURA DE UN ANALIZADOR SINTACTICO DESCENDENTE RECURSIVO
Est
rate
gia
de
sce
nd
en
te r
ecu
rsiv
a
![Page 18: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/18.jpg)
CORRESPONDENCIA ENTRE GRAFOS SINTACTICOS Y LOS PROGRAMAS
Est
rate
gia
de
sce
nd
en
te r
ecu
rsiv
a
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 19: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/19.jpg)
CORRESPONDENCIA ENTRE GRAFOS SINTACTICOS Y LOS PROGRAMAS
Est
rate
gia
de
sce
nd
en
te r
ecu
rsiv
a
REGLA 2: Secuencia de llamada a procedimientos.
BEGIN P(S1); P(S2); ….; P(S3) END;
S1 S2 Sn
![Page 20: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/20.jpg)
CORRESPONDENCIA ENTRE GRAFOS SINTACTICOS Y LOS PROGRAMAS
Est
rate
gia
de
sce
nd
en
te r
ecu
rsiv
a
WHILE ch IN PRIMERO(S) DO P(S);
S
REGLA 3: Proposición de repetición.
![Page 21: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/21.jpg)
CORRESPONDENCIA ENTRE GRAFOS SINTACTICOS Y LOS PROGRAMAS
Est
rate
gia
de
sce
nd
en
te r
ecu
rsiv
a
IF ch IN PRIMERO(S) THEN P(S);
REGLA 4: Proposición condicional.
S
![Page 22: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/22.jpg)
CORRESPONDENCIA ENTRE GRAFOS SINTACTICOS Y LOS PROGRAMAS
Est
rate
gia
de
sce
nd
en
te r
ecu
rsiv
a
P(S);
REGLA 5: Llamada a procedimiento
S
![Page 23: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/23.jpg)
CORRESPONDENCIA ENTRE GRAFOS SINTACTICOS Y LOS PROGRAMAS
Est
rate
gia
de
sce
nd
en
te r
ecu
rsiv
a
REGLA 6: Lectura condicional
S
IF ch = “t” THEN read(ch) ELSE Error;
![Page 24: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/24.jpg)
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 DE ANÁLISIS SINTÁCTICO(1)
An
ális
is S
intá
ctic
o T
ab
ula
r
![Page 25: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/25.jpg)
En la gramática anterior:
CONSTRUCCIÓN DE TABLAS DE ANÁLISIS SINTÁCTICO(2)
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 )
An
ális
is S
intá
ctic
o T
ab
ula
r
![Page 26: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/26.jpg)
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.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.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 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
Caso contrario “Error “Hasta X = $ /* la pila esta vacia */
ANÁLISIS SINTÁCTICO PREDICTIVO NO RECURSIVO(1)
An
ális
is S
intá
ctic
o T
ab
ula
r
![Page 27: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/27.jpg)
Ejemplo: Analizar si: id + id * id es valida para la gramática anteriormente presentada.
ANÁLISIS SINTÁCTICO PREDICTIVO NO RECURSIVO(2)
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’ Є
An
ális
is S
intá
ctic
o T
ab
ula
r
![Page 28: Teoría de lenguajes y compiladores](https://reader036.fdocuments.co/reader036/viewer/2022062807/56815200550346895dc040e8/html5/thumbnails/28.jpg)
Teoría de lenguajes y compiladores
Unidad I
Analizador Sintáctico
Temas
Análisis Sintáctico Descendente
Semana 8