You are on page 1of 26

Árboles de derivación

–Árboles de derivación

Departamento de Ciencias de la Computación

Derivaciones

Si A   entonces A   es una derivación


donde , son cadenas arbitrarias de símbolos gramaticales.

Si 1  2  ...  n se dice que 1 deriva a n


 deriva en un paso
* deriva en cero o más pasos


Departamento de Ciencias de la Computación


Derivaciones

Podemos decir:
*  

*  y   , entonces  
* 

Del mismo modo se puede decir


+
 deriva en uno o más pasos

Departamento de Ciencias de la Computación

Derivaciones

• Una derivación por la izquierda es


aquella en la que se reemplaza el no
terminal más a la izquierda en cada
paso de la derivación.
– análogamente para la derecha
• Una derivación por la izquierda
corresponde a la numeración preorden
de los nodos internos de su árbol de
análisis gramatical asociado.
– derecha – postorden inversa
Departamento de Ciencias de la Computación
Árboles de derivación

• Toda derivación de las gramáticas de


tipo 1, 2 ó 3 se puede representar
mediante un árbol.

Departamento de Ciencias de la Computación

Ejemplo de árbol de derivación


N
• Sea la gramática:
G = ( 0,2,4,6,8),(N,C),N, {
C N
N  C | CN
C0|2|4|6|8
C N
})
C

4 8 0
• Sea la derivación
N  CN  CCN  CCC  4CC  48C  480

Departamento de Ciencias de la Computación


Ejercicio

• Sea la gramática
S(L)|a
LL,S|S
– ¿Cuáles son los elementos no terminales?
– ¿Cuáles son los elementos terminales?
– ¿Cuáles es el símbolo inicial?
– Realizar los árboles sintácticos de
• (a , a)
• (a , (a , a))
• (a , ((a , a) , (a , a)))

Departamento de Ciencias de la Computación

Ambigüedad

• Una gramática es ambigua si el


lenguaje que define contiene alguna
cadena que tenga más de un árbol de
análisis sintáctico. (no ambigua implica un
único árbol)
– No es posible construir analizadores eficientes
para gramáticas ambiguas.
– Con ciertas restricciones a la gramática se
podrá afirmar que no es ambigua.

Departamento de Ciencias de la Computación


Ejemplo de gramática ambigua

• Sea una gramática cuyas reglas de


producción son las siguientes:
EE+E
EE*E
En
E  (E)
• Se pide el o los árboles sintácticos de
“7+4*2”.

Departamento de Ciencias de la Computación

Ejemplo de gramática ambigua

E (15) Gramática
EE+E
EE*E
E + E (8) En
E  (E)

E * E Producción
n EE+E
n+E
(7)
n n n+E*E
n+n*E
(4) (2) n+n*n

Departamento de Ciencias de la Computación


Ejemplo de gramática ambigua

Gramática E (22)
EE+E
EE*E
En E(11) * E
E  (E)

+ E
Producción E n
EE*E
E+E *E
n+E *E n n (2)
n+n *E (7) (4)
n+n *n

Departamento de Ciencias de la Computación

Ejemplo de gramática ambigua

• Solución a la ambigüedad  modificar


las reglas de producción. E (15)
Distinguiendo factor y
E + T (8)
término (producto de
dos factores)
T T F
EE+T|T *
TT*F|F F F
F  (E) | n
n n
árbol sintáctico de “7+4*2”
n
(7) (4) (2)

Departamento de Ciencias de la Computación


Ejercicio

• Sea la gramática
SaSbS
SbSaS
Sλ
– Demostrar que es ambigua contruyendo dos
árboles sintácticos correspondientes a la frase
abab

Departamento de Ciencias de la Computación

Gramáticas bien formadas

• Características de las gramáticas que


se deben evitar para que no sea
ambigua
– Reglas innecesarias:
• AA
– Símbolos innaccesibles:
• U  A donde U ∈ N y no aparece en la parte derecha
de ninguna otra regla y U no es el símbolo del axioma.
• U es accesible ⇔ S ⇒
* xUy, x,y ∈ 
*

Departamento de Ciencias de la Computación


Gramáticas bien formadas

– Regla superfluas
• Para no ser superfluo U ∈ N debe cumplir
+
U ⇒ x, x ∈  * T

– Eliminación de símbolos no generativos:


• G = (T, N, S, P)
para cada A ∈ N se genera G(A)
si L(G(A)) es vacío A es un símbolo no generativo
– Eliminación de reglas de redenominación, A  B
* B y para cada regla de la
• para cada A ∈ N tal que A ⇒
forma B  x donde x ∈ N se añadirá una regla de la forma
Ax

Departamento de Ciencias de la Computación

Gramáticas bien formadas

– Eliminación de reglas no generativas, A  λ:


• Si L(G) no contiene λ
es posible eliminarlar todas
• En caso contrario
se pueden eliminar todas menos S  λ
* λy
donde para cada A ∈ N (A  S) tal que A ⇒
por cada regla B  xAy se añadirá otra regla de la
forma B  xy excepto si x=y=λ

Departamento de Ciencias de la Computación


Gramáticas bien formadas

– Ciclos:
– SA
– Sa
– AS
– Reglas que ofrezcan caminos alternativos:
– SA
– SB
– AB

Departamento de Ciencias de la Computación

Gramáticas bien formadas

– Producciones recursivas en las que las


variables no recursivas de la producción
pueden derivar a la cadena vacía:
– SHRS  SHR
– Ss  Hh|
– Hh|λ λ
– Rr|λ  Rr|λ

Departamento de Ciencias de la Computación


Ejemplo

• Limpiar la siguiente gramática

G = ({0,1}, {S, A, B, C}, S, P)


– S  AB | 0S1 | A | C
– A  0AB | λ
– B  B1 | λ

Departamento de Ciencias de la Computación

Ejemplo

• G = ({0,1}, {S, A, B, C}, S, P)


– S  AB | 0S1 | A | C
Símbolo no
– A  0AB | λ generativo

– B  B1 | λ

• G = ({0,1}, {S, A, B, C}, S, P)


– S  AB | 0S1 | A
– A  0AB | λ
– B  B1 | λ

Departamento de Ciencias de la Computación


Ejemplo

• G = ({0,1}, {S, A, B, C}, S, P)


– S  AB | 0S1 | A
– A  0AB | λ Eliminación de
reglas de la
– B  B1 | λ forma x  λ

• G = ({0,1}, {S, A, B, C}, S, P)


– S  AB | 0S1 | A | B | λ
– A  0AB | 0B | 0A | 0
– B  B1 | 1

Departamento de Ciencias de la Computación

Ejemplo

• G = ({0,1}, {S, A, B, C}, S, P)


– S  AB | 0S1 | A | B | λ
– A  0AB | 0B | 0A | 0 Eliminación de
reglas de
– B  B1 | 1 redenominación
SA|B

• G = ({0,1}, {S, A, B, C}, S, P)


– S  AB | 0S1 | 0AB | 0A | 0B | B1 | 0 | 1 | λ
– A  0AB | 0B | 0A | 0
– B  B1 | 1

Departamento de Ciencias de la Computación


Ejercicio

• G = ({i,+}, {Z, E, F, G, P, Q, S, T}, Z, P)


– ZE+T
– EE|S+F|T
– F  F | FP | P
– PG
– G  G | GG | F
– TT*i|i
– QE|E+F|T|S
– Si

Departamento de Ciencias de la Computación

Asociatividad de los operadores

• La asociatividad de un operador binario


define cómo se operan tres o más
operandos.
– Por la izda: se evalúan de izda. a dcha. Es
la que utilizan la mayoría de los lenguajes.

Ejemplo “b#a#3.8”.
 Primero se opera “b” con “a” y después

el resultado con “3.8”


– Muchos de los operadores no son
conmutativos.
Departamento de Ciencias de la Computación
Asociatividad

• Cuando la asociatividad de un operador


es por la izquierda, la regla sintáctica
en la que interviene dicho operador
debe ser recursiva por la izquierda, y
análogamente por la derecha.

Departamento de Ciencias de la Computación

Precedencia

• La precedencia de un operador
especifica el orden relativo de cada
operador respecto a los demás
operadores.
– Ej. “2%3#4” con mayor precedencia del #,
primero se operaría el 3 y el 4, y el
resultado con el 2

Departamento de Ciencias de la Computación


Precedencia

• En la mayoría de los lenguajes los


operadores multiplicativos tienen
mayor preferencia que los aditivos.
• Uso de paréntesis para agrupar los
operadores según la conveniencia del
programador y eludir las precedencias
y asociatividades definidas en el
lenguaje.

Departamento de Ciencias de la Computación

Ejemplo de precedencia

• Supóngase los operador “+” y “-” con


asociatividad por la izquierda y los
operadores “*” y “/” con asociatividad
por la derecha.

• Precedencia habitual: “*” y “/” mayor


precedencia que “+” y “-” y los
paréntesis la máxima preferencia.

• Gramática?
Departamento de Ciencias de la Computación
Solución al ejemplo de precedencia

• EE+T
• EE-T
• ET
¿Cómo sería el árbol asociado a
• TF*T la siguiente sentencia?
• TF/T 12 - 4 - 6 / 2 / 2

• TF
• F  (E)
• Fn

Departamento de Ciencias de la Computación

Solución al ejemplo de precedencia


E
• EE+T
• EE-T E
-
T
• ET
/
T
• TF*T E - T F

• TF/T T
F n F / T
(6)
• TF F
n
F
n
• F  (E) n
(4)
(2)
n
(12)
• Fn (2)
12 - 4 - 6 / 2 / 2
Departamento de Ciencias de la Computación
Gramática correcta

• La gramática debe reflejar la


precedencia y asociatividad de los
operadores puesto que la mayoría de
los lenguajes objeto no tienen
precedencia o asociatividad.

Departamento de Ciencias de la Computación

Lenguajes y procesadores de lenguaje

• Lenguaje naturales
• Lenguajes artificiales
• Lenguajes de programación

•Procesadores de lenguaje
•Compilador
•Interprete
•Compilador-Interprete

Departamento de Ciencias de la Computación


Procesador de lenguaje: partes

• Tabla de símbolos e identificadores


• Analizador léxico
• Analizador sintáctico
• Analizador semántico
• Generador de código
• Optimizador de código
• Gestión de memoria
• Recuperación de errores detectados

Departamento de Ciencias de la Computación

Fases de un compilador
Programa fuente

Analizador léxico
Análisis

Analizador sintáctico

Tabla de Gestión
Analizador semántico de
símbolos
errores
Generación de código intermedio

Optimizador de código intermedio

Generador/optimizador de código objeto

Programa objeto
Departamento de Ciencias de la Computación
Organización de las fases en front end y
back end
Programa fuente

Código intermedio

Front Análisis léxico


end Back Optimización
Análisis sintáctico Análisis end código intermedio
semántico
Generación de Generación Optimización
código intermedio código objeto código objeto

Código objeto

Departamento de Ciencias de la Computación

Front end y back end

• Front end:
– fases de análisis y generación de código
intermedio.
– depende del lenguaje fuente y es
independiente del lenguaje objeto.
• Back end:
– fases de generación y optimización de código.
– depende del lenguaje objeto y es
independiente del lenguaje fuente.

Departamento de Ciencias de la Computación


Tipos de análisis sintáctico.

• Descendente.
– Análisis descendente: se parte de la raíz del
árbol (símbolo inicial de la gramática) y se
van aplicando reglas por la izquierda
obteniendo una derivación por la izda. del
símbolo inicial. Las hojas del árbol tendrán los
tokens que nos devuelve el analizador léxico.
• Ascendente
– Análisis ascendente: se empieza por las hojas
(tokens) y se van creando los nodos
intermedios hasta llegar a la raíz (símbolo
inicial).
Departamento de Ciencias de la Computación

Ejemplo

• Ej.: Dada la entrada “num*num+num”


y la gramática:
–EE+T|T
–TT*F|F
– F  num
obtener las derivaciones por ambos
métodos de análisis

Departamento de Ciencias de la Computación


Ejemplo de análisis sintáctico: descendente
E Gramática
EE+T|T
TT*F|F
E T F  num
+
T Producciones:
F  E  E + T

 E  T

T * F  T  T * F

num  T  F

 F  num
F num  F  num

 T  F

num  F  num

Departamento de Ciencias de la Computación

Ejemplo de análisis sintáctico: ascendente


E Gramática
EE+T|T
TT*F|F
E F  num

T Producciones:
 F  num

 T  F

T F T  F  num

 T  T * F

 E  T
F F  F  num

 T  F

num * num + num  E  E + T

Departamento de Ciencias de la Computación


Gramáticas que permiten un análisis en tiempo
lineal O(n)
• Análisis descendente: gramáticas LL(k)
• Análisis ascendente: gramáticas LR(k)
– L es left to right: la secuencia de tokens de
entrada se analiza de izquierda a derecha.
– L/R es left-most/right-most: obtiene la
derivación por la izquierda/derecha.
– k es el número de símbolos de entrada que es
necesario conocer en cada momento para
poder hacer el análisis.

Departamento de Ciencias de la Computación

Gramáticas que permiten un análisis en tiempo


lineal O(n)
• Ej.: LL(2): cadenas
– analizadas de izquierda a derecha
– derivando el no terminal que quede por
derivar más a la izquierda
– necesita mirar dos tokens.

Departamento de Ciencias de la Computación


Ejemplo

• Diseñar una gramática no ambigua que


genere todos los números enteros sin
signo que sean pares, considerando
que el 0 es par también.
NDN
N  Digpar
D0|1|2|3|4|5|6|7|8|9
Digpar  0 | 2 | 4 | 6 | 8

Departamento de Ciencias de la Computación

Ejercicio

• Sea la gramática
ScAd
Aab
Aa
y la cadena de entrada cad
– Construir el árbol sintáctico
– ¿Qué paso realiza para la generación del
árbol?

Departamento de Ciencias de la Computación


Ejercicio

Gramática
ScAd S
Aab
Aa
Aab c A d S
Aa
S
ScAd
a b c A d
c A d
error
a
Departamento de Ciencias de la Computación

Ejercicio

• Sea la gramática
SaSbS
SbSaS
Sλ
y la cadena de entrada abab
– Construir dos árboles sintáctico
– ¿Qué paso realiza para la generación del
árbol?

Departamento de Ciencias de la Computación


Ejercicio

Gramática
SaSbS
SbSaS S Cadena S
Sλ abab

a S b S a S b S
λ
a S b S λ
b S a S
λ λ λ λ
Departamento de Ciencias de la Computación

Ejercicio

• Considerese la gramática independiente del


contexto G = ({*,+, a}, {S}, S, P).
–SSS+
|SS*
|a
– Demostrar como se puede generar la cadena
aa+a*
– Construir el árbol sintáctico para esta cadena
– ¿Qué lenguaje genera esta gramática?

Departamento de Ciencias de la Computación


Ejemplo

• Diseñar una gramática no ambigua para la


declaración de variables enteras, carácter o real
en C.
Debe admitir declaraciones del tipo:
int i,j; char c,r; lista_decl  decl lista_decl
float f, f2; | decl
decl  tipo lista_var ';'
lista_var  ident ',' lista_var
| ident
tipo  int
| char
| float
Departamento de Ciencias de la Computación

Ejemplo

• Dada la gramática siguiente, escribe


las derivaciones por la izquierda y los
árboles de análisis gramatical para las
siguientes expresiones:
–3+4*5-6 expr  expr opsuma term
| term
– 3 * (4 - 5 + 6) opsuma '+'
– 3 - (4 + 5 * 6) | '-'
term  opmult factor
| factor
opmult  '*'
factor  '(' expr ')'
| num
Departamento de Ciencias de la Computación
Ejemplo

• Dada la siguiente gramática de


expresiones simplificadas tipo LISP.
Escribe una derivación por la izquierda
y otra por la derecha para la cadena
– ( a 23 ( m x y ) ) list  '(' list_exp ')'
– dibuja árbol de análisis list_exp  list_expr expr
gramatical para esta cadena | expr
expr  atomo
| list
atomo  numero
| identificador

Departamento de Ciencias de la Computación

You might also like