Sie sind auf Seite 1von 50

Facultad de Ingeniería de Sistemas

Lenguajes y Compiladores
Aspectos Formales (Parte 2)

Compiladores
2007
1
Derivaciones

 El proceso de búsqueda de un árbol sintáctico para una


cadena se llama análisis sintáctico.
 El lenguaje generado por una gramática es igual al
conjunto de cadenas que pueden ser generadas por un
árbol sintáctico a través del uso de las producciones de
esa gramática..
 Se dice que una gramática es ambigua si para una
misma frase encontramos dos árboles sintácticos
diferentes. Por ejemplo la gramática G0 es ambigua ya
que para la frase 6 + 9 - 5 podemos graficar dos
árboles sintácticos diferentes. (¿Cuáles?)

Compiladores
2007 2
Definiciones

 Podemos definir un lenguaje L(G) como:


L(G) = {σ | S →* σ y σ∈T*}
 Producciones libres de contexto: tienen la forma
v→σ con σ ∈ (N ∪ T) *
Expresa que un símbolo no terminal v puede ser
sustituido por σ sin importar el contexto donde
aparece v
 Derivaciones por la izquierda (derecha): siempre se reemplaza
el no terminal mas a la izquierda (o más a la derecha)
 Una gramática independiente del contexto es no ambigua si y
solo si existe una sola derivación por la izquierda (o por la
derecha) y por ende un solo árbol de análisis sintáctico.
Compiladores
2007 3
*
Definiciones

 Si:
X →* α X β
se dice que X es recursivo.
Si α = ε se dice que es recursivo por la izquierda.
“Si la gramática tiene un símbolo no terminal
recursivo se dice que la gramática es recursiva”.
 La inversa de la derivación es la reducción:
α→ β es equivalente β←α
β puede derivarse directamente de α o
β puede reducirse directamente a α.

Compiladores *
2007 4
Jerarquía de gramáticas

“Las gramáticas fueron clasificadas de


acuerdo a su complejidad, y a esta
clasificación se le conoce con el nombre de
Jerarquía de Chomsky”

Compiladores
2007 5
Jerarquía de gramáticas

Tipo 0 : sin restricciones

Tipo 1 : sensibles al contexto αX β→ αγ β

Tipo 2 : independiente del contexto X→ α


Tipo 3 : regulares
A → Ba o A→a o
A → aB o A→a

Compiladores
2007 6
Definición de CHOMSKY:

Gramática de un Lenguaje (G)

G = ( N, T, P, S )
Es un cuarteto formado por:
N = Vocabulario No Terminal : Son sentencias que no
pertenecen al lenguaje, pueden ser variables y
nombre de procedimientos, se representan con
letra mayúscula.
A No Terminal
<A> No Terminal
[A] No Terminal
Compiladores
2007 7
Definición de CHOMSKY

T = Vocabulario Terminal. sentencias que pertenecen al


lenguaje, se representan con minúsculas.
<S> → if x then <B>
<B> → w z

P = Reglas de producción o Reglas de derivación.


<S> → do <A> while x
Produce o deriva.
Axioma Principal.
S = Es el axioma principal o símbolo distinguido.
<S> da inicio a las reglas de producción.
<S> pertenece al vocabulario no terminal.
Compiladores
2007 8
Definición de CHOMSKY
Si se tiene las siguientes reglas:
R1 : <S> → w x do <A>

R2 : <A> → if z then <B> else <C>

R3 : <B> → x y z

R4 : <C> → a b c

Donde :
N = {<S>, <A>, <B>, <C>}

T = {w, x, do, if …}
Compiladores
2007 9
Tipos de Gramática

Definición Chomsky

G = ( N, T, P, S)

Gramática.- Se clasifica en 4 tipos.

A. Gramática Estructura de Base.


B. Gramática Sensible al Contexto.
C. Gramática de Contexto Libre.
D. Gramática Regulares.

α→β Regla de Producción


Compiladores
2007 10
Tipos de Gramática

A. Gramática Estructura de Base Tipo 0.- No


existe restricción en las Reglas.

α→β donde : α ∈ ( N U T )+
β ∈ ( N U T )*

Ejemplos :

R1 : w x <A> → if x then <B>


R2 : a b <S > → c d a
R3 : w a <B> → ε

Compiladores
2007 11
Tipos de Gramática

B. Gramática Sensible contexto Tipo 1.

α→β

θAϒ→ θ wϒ donde :
ϒ θ ∈ (NUT)* → puede ser nulo.

W ∈ (NUT)+ → no puede ser nulo.

A∈N
Ejemplos :

R1: w <A> d → abc


R2: <A> a → <B>c
Compiladores
2007 12
Tipos de Gramática

C. Gramática Tipo 2 contexto Libre.- En la parte


izquierda tiene solo un símbolo del vocabulario no
termina.

α→β donde :
α∈N
β ∈ (NUT)*

Ejemplos :
R1: <S> → w x d <B>
R2: <B> → i x t <A>
R3: <A> → s c x <c>
R4: <C> → λ
Compiladores
2007 13
Tipos de Gramática

D. Gramática Regular Tipo 3.- “En la parte izquierda y


derecha debe existir un No Terminal como máximo”
I).Gramáticas regulares por la izquierda:
Se dice que G (T, N, P, S) es regular por la izquierda
si cada producción P tiene la forma

<A> → a <B> o bien <A> → a

donde : <A> ∈ N
<B> ∈ N*

Compiladores
a ∈ T+
2007 14
Tipos de Gramática

“Estas gramáticas también se conocen como regulares


o de estado finito”.
II). Gramáticas regulares por la derecha:
Se dice que G (T, N, P, S) es regular por la derecha si
cada producción P tiene la forma.

<A> → <B> a <A> → a


o bien
donde : <A> ∈ N
<B> ∈ N*

Compiladores
a ∈ T+
2007 15
Tipos de Gramática

 “En general los lenguajes de programación no se pueden


expresar totalmente con gramáticas regulares, pero
estas gramáticas si definen la sintaxis de los
identificadores, números, cadenas, etc”.
S → aS  bB  b
B → cC
C → aS
 En compiladores interesan las gramáticas tipo 2 y 3.
 Con las gramáticas tipo 2 se puede controlar la
presencia correcta de pares de símbolos como Begin,
end o paréntesis.

Compiladores
2007 16
Tipos de Gramática

 Sin embargo hay características que no pueden


expresarse a través de gramáticas tipo 2 o 3. Por
ejemplo, para que la instrucción X := B esté correcta
es necesario:
 X y B estén declarados

 X y B sean de tipos compatibles

 B tenga un valor definido.

 Estas características se verifican con el analizador


semántico usando la tabla de símbolos.

Compiladores
2007 17
Ejemplo

 Ejemplo :
S → abc  aAbc
Ab → bA
Ac → Bbcc
bB → Bb
aB → aa  aaA

Ejemplo de cadena: ?
¿Qué tipo de cadenas genera este lenguaje?

Compiladores *
2007 18
Lenguaje Definido por una Gramática

En una gramática α → β
α va producir β siempre que se transforme, cambie o se
derive hasta llegar a ser igual a β a estos cambios se le
denomina derivación de longitud.

α → ϒ0 → ϒ1 → ϒ2 ….. ϒn = β
Derivación de longitud n
→ cambios
α→+β Derivación de Longitud transitiva
α→*β incluye el elemento nulo o Tira a Nulo.
Compiladores
2007 19
Lenguaje Definido por una Gramática

Definición de un lenguaje
L(G)= { x / <S> → * x .and. x ∈ T* }
“Un lenguaje definido por una gramática G está
compuesto por símbolos x, tal que x es la tira de
símbolos terminales o sentencia del lenguaje L(G) que
se obtiene al seguir una serie de derivaciones directas
partiendo de <S>”
Ejemplo
Un lenguaje tiene las siguientes reglas.
R1: <S> → while <A> end
Compiladores
2007
R2: <A> → while end 20
Lenguaje Definido por una Gramática

A. Determine si while while end end pertenece al


lenguaje
L(G)= {x / <S> → * x .and. x ∈ T* }
X elemento terminal que se analiza
Solución. Se parte de L(G)
R1 <S> → while <A> end
xR2 <S> → while while end end

∴ while while end end ∈ L(G)


Compiladores
2007 21
Ejercicio

1. Se tienen las siguientes reglas.


R1: <S> → a <B>
R2: <S> → b <A>
R3: <A> → a
R4: <A> → a <S>
R5: <A> → b <A> <A>
R6: <B> → b
Determine si Pertenece L (G)
R7: <B> → b <S>
R8: <B> → a <B> <B> a) a b a a a b
R9: < B> → λ b) b a a a a b b

Compiladores
2007 22
a. Determine si abaaab pertenece L(G)

Solución:
R1 : <S> → a <B>
XR7 : <S> → ab <S>
XR1 : <S> → aba <B>
XR8 : <S> → abaa <B> <B>
XR8 : <S> → abaaa <B> <B> <B>
XR6 : <S> → abaab <B> <B>
XR9 x R9 : <S> → abaaab λ λ

Compiladores
2007 ∴ abaaab ∈ L (G) 23
b. Determine si baaaabb pertenece L(G)

Solución:
xR2: <S> → b <A>
xR4: <S> → ba <S>
xR1: <S> → baa <B>
xR8: <S> → baaa <B> <B>
xR8: <S> → baaaa <B> <B> <B>
xR6 xR6xR9: <S> → baaaabb λ

∴ baaaabb ∈ L (G)
Compiladores
2007 24
Ejercicio

2. Se tienen las siguientes reglas


R1: <S> → w <A> <S>
R2: <S> → d
R3: <A> → w
R4: <A> → d <S> <A>

a. Reconocer w d d w d
b. Reconocer w w w d d w d d

Compiladores
2007 25
a. Reconocer wddwd

Solución:
xR1: <S> → w <A> <S>
xR4: <S> → wd <S> <A> <S>
xR2: <S> → wdd <A> <S>
xR3: <S> → wddw <S>
xR2: <S> → wddwd

∴ wddwd ∈ L(G)
Compiladores
2007 26
b. Reconocer wwwddwdd

L(G) = {x / <S> → * x .and. x ∈T* }


Solución:
xR1: <S> → w <A> <S>
xR3: <S> → w w <S>
xR1: <S> → w w w <A> <S>
xR4: <S> → w w w d <A> <S>
xR2: <S> → w w w dd <A> <S>
xR3: <S> → w w wddw <S>
xR2: <S> → w w w d d w d

Compiladores ∴wwwddwdd ∉ L(G)


2007 27
Resumen
A. Tipos Gramática.
1. Estructura de Base Tipo 0 :
α→β donde : α ∈ ( N U T )+ β ∈ ( N U T )*

2. Sensible Contexto Tipo 1:


α→β
θAϒ→ θ wϒ donde : ϒ θ ∈ (NUT)*
W ∈ (NUT)+
A∈N
Compiladores
2007 28
Resumen

3. Contexto Libre Tipo 2


α→β donde : α ∈ N β ∈ (NUT)*
4. Regular Tipo 3
<A> → a <B> Acepta como máximo un no
terminal en la izquierda y derecha.
<A> → b

B. Lenguaje Reconocido por una Gramática.

L (G) = { x / <S> → * x .and. x ∈ T *}


Axioma Principal
Compiladores
2007 29
Técnicas de análisis

 La tarea de un compilador no es generar frases, un


compilador debe verificar si una frase pertenece al
lenguaje o no.
 El análisis sintáctico es el proceso de búsqueda de un
árbol sintáctico correspondiente a una frase.
 Normalmente se usan dos métodos:
 Análisis sintáctico descendente: parte de la raíz y

baja hacia las hojas


 Análisis sintáctico ascendente: comienza por las hojas

e intenta llegar a la raíz

Compiladores
2007 30
Técnicas de análisis
Representación Gráfica – Arbol Sintáctico
Implica usar un árbol ordenado, está formado por un
Nudo (Elemento no Terminal parte Izquierda) y por
ramas que serán la parte derecha de la regla.
<A> → a <B> b
Nudo Ramas (derecha)
<A> nudo

a <B> b Ramas
Compiladores
2007 31
Análisis descendente

T = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
N = { Digito, Enn}
P = { Enn → Digito | Enn Digito
Digito → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 }
S = {Enn}
Para analizar la frase 123, se comienza con la raíz
Enn que deriva a Enn Digito.
Enn

Enn Digito

Compiladores
2007 32
Análisis descendente

Aplicando la misma producción:


Enn

Enn Digito

Enn Digito

Con la producción Enn → Digito seguimos construyendo


el árbol

Compiladores
2007 33
Análisis descendente
Enn

Enn Digito

Enn Digito

Digito

Con la producción Digito → 1 seguimos construyendo


el árbol y obtenemos

Compiladores
2007 34
Análisis descendente
Enn

Enn Digito

Enn Digito

Digito

1 2 3
Podemos ver que el árbol crece hacia abajo conforme se va
leyendo la frase de izquierda a derecha.

Compiladores
2007 35
Análisis ascendente

 Veremos como se realiza el análisis ascendente para


la misma frase 123.
 Sólo conocemos la raíz y la frase.
 Con la reducción 1 ← Digito obtenemos
Digito

1 2 3

 Con la reducción Digito ← Enn llegamos a:

Compiladores
2007 36
Análisis ascendente
Enn

Digito

1 2 3
Y luego
Enn Digito

Digito

1 2 3

Compiladores
2007 37
Análisis ascendente

Podemos usar la reducción Enn Digito ← Enn


Enn

Enn Digito

Digito

1 2 3
Repitiendo el uso de las mismas derivaciones llegamos a
obtener:

Compiladores
2007 38
Análisis ascendente
Enn

Enn Digito

Enn Digito

Digito

1 2 3

Compiladores
2007 39
Análisis sintáctico

 En cualquiera de los métodos usados llegamos a la


solución porque se tenia conocimiento de la frase
completa (conocer el programa completo?)
 Si no hay un preanálisis se podrían tomar decisiones
como (para un análisis descendente):
Enn
Lo que nos llevaría a una situación
Digito
sin salida (deadlock) ya que llegamos
de la hoja a la raíz y todavía no
terminamos de recorrer la frase.
1

Compiladores
2007 40
Análisis sintáctico

 Para resolver este problema se definen los


conjuntos Primero y Siguiente que permitirán
realizar el análisis sintáctico sin bloqueos mutuos.
 La idea básica es que mirando un número fijo de
caracteres hacia adelante se pueda determinar
exactamente cual es el árbol que corresponde.

Compiladores
2007 41
Tarea

 Seleccione una grafo sintáctico del Pascal y escriba


la producción correspondiente.
 Deberá tener por lo menos:
 Alternativas ( | )
 Una repetición de elementos ( { } )
 Un elemento opcional ( [ ] )

Compiladores
2007 42
Ejercicio
1. Se tienen las siguientes reglas.
R1: <S> → a
R2: <S> → a <A> a
R3: <A> → b
R4: <A> → b <A>
Reconocer mediante el árbol sintáctico
a) a b b a
b) a b b b b a
c) a a a b b a
Compiladores
2007 43
Ejercicio
2. Se tienen las siguientes Reglas
R1: <S> → do <B>
R2: <S> → ; <A>
R3: <A> → do Reconocer mediante el árbol
sintáctico
R4: <A> → do <S>
R5: <A> → ; <A> <A>
a) do ; do do do ;
R6: <B> → ;
b) do; do ; ; ; do do do ;
R7: <B> → ; <S>
c) ; do do do ; do do ; do
R8: <B> → do <B> <B>
R9: <B> → λ
Compiladores
2007 44
Notación ampliada de las reglas EBNF

“En un lenguaje, se utilizan más de un centenar de

reglas “Backus Normal Form” para describir la

gramática de un lenguaje por lo que se ha ido

introduciendo simplificaciones o formas compactas

llamadas “Extended Backus Form” “

Compiladores
2007 45
Notación ampliada de las reglas EBNF
Variantes
1. Alternativa de una regla.- Varias reglas tienen el
mismo símbolo no terminal (N) en la parte izquierda,
varias reglas pueden expresarse en una regla.

R1 : <S> → a <B> a
R2 : <S> → b <A>
R3 : <S> → a <S> a
R4 : <S> → b
R5 : <S> → λ
<S>→a <B> a |b<A>|a<S>a |b| λ
R1 R2 R3 R4 R5
Compiladores
2007 46
Notación ampliada de las reglas EBNF

2. Uso de Llaves.- Las llaves nos indica que el


símbolo que encierra se repite desde cero hasta un
número arbitrario de veces

R1 : <S> → <A> a
R2 : <A> → b <S> → <A> a
R3 : <A> → bb <A> → {b}51
R4 : <A> → bbb
R5 : <A> → bbbb
R6 : <A> → bbbbb

Compiladores
2007 47
Notación ampliada de las reglas EBNF

3. Uso de paréntesis cuadrados (Corchetes).- Es un


caso particular de las llaves.

[ X ] = { X }1
0
Se puede usar o no se
puede usar

<S> →a <B> c <S> [b <S>]


Se puede hacer 1 vez
o ninguna vez
Compiladores
2007 48
Ejercicio
1. Se tiene las siguientes reglas:
R1: <S> → <T> <F>
R2: <F> → + <T> <F> | λ Reconocer con el árbol
R3: <T> → <E><L> sintáctico

R4: <L> → * <E><L>| λ 1) a*(a+a)

R5: <E> → ( <S> ) | a 2) (a+a)*a*(a+a)


3) a+a+a+a+(a+a)*a

Compiladores
2007 49
Ejercicio

2. Se tiene las siguientes reglas


R1: <S> → ( <A> )
R2: <A> → <T> <F> Reconocer con el árbol
sintáctico
R3: <F> → + <A> | λ
1) ((a) + (a) + a+a)
R4: <T> → <S>| a
2) (a+a+(a)+a+(a))
3) (a+a+a+(a+a)+a)

Compiladores
2007 50

Das könnte Ihnen auch gefallen