Vous êtes sur la page 1sur 35

GRAMÁTICAS ASCENDENTES Y

DESCENDENTES

Laboratorio de Organización de Lenguajes y


Compiladores 1
Universidad de San Carlos de Guatemala.
- Gramáticas

- Gramáticas Ascendentes.
• Funcionamiento.
• Implementar de una pila por desplazamiento y reducción.
• Uso de precedencia de Operadores.

-Gramáticas Descendentes
• Funcionamiento.
• Reescritura de Gramáticas
o Supresión de la Ambigüedad.
o Factorización por la izquierda.
o Eliminación de la recursividad por la izquierda.
Las ventajas de las gramáticas:
• Las gramáticas son especificaciones sintácticas y
precisas de lenguajes de programación.
programación
• A partir de una gramática se puede generar
automáticamente un analizador sintáctico.
• El proceso de construcción puede llevar a descubrir
ambigüedades.
• Una gramática proporciona una estructura a un lenguaje
de programación, siendo más fácil generar código y
detectar errores.
• Es más fácil ampliar/modificar el lenguaje si está descrito
con una gramática.
∑ = Vocabulario finito de símbolos terminales. Los
símbolos terminales son los símbolos validos en un
lenguaje.
N = Conjunto finito de símbolos No Terminales los
cuales son metasímbolos que deben ser definidos por
otras producciones.
S = Un símbolo terminal básico. Este será el símbolo
principal que describirá oraciones enteras.
P = Conjunto de reglas que nos dicen que se puede
generar como parientes del axioma.
Es también conocido como:

1. Gramáticas por desplazamiento y reducción.


2. Gramáticas por precedencia de operadores.

Las gramáticas ascendente intenta construir


un árbol de análisis sintáctico para una cadena de entrada
que comienza por las hojas (fondo) y avanza hacia la raíz (la
cima).

Se puede considerar este proceso como de "reducir" una


cadena w al símbolo inicial de la gramática.
Gramática Entrada para la gramática

S-->L uno,dos,tres,cuatro,cinco
L-->L,id
| id
Se basa en una máquina de pila donde:

• El alfabeto de la pila está formado por los símbolos


terminales y no terminales.
• El alfabeto de entrada está formado por los símbolos
terminales.
• La función de transición se define en base a las siguientes
acciones sobre la pila:
{ Desplazar, Reducir, Aceptar, Error }

El proceso de análisis consiste en ir explorando el cima de la


pila y los elementos siguientes en la pila hasta encontrar una
subcadena τ que coincida con la parte derecha de una
producción dada A → τ.
GRAMÁTICAS POR PRECEDENCIA DE
OPERADORES
Resuelve la acción alternativa (ante posibles
conflictos desplaza/reduce) en base a criterios de
precedencia entre operadores.

El análisis de precedencia de operador es aplicable a


lenguajes definidos por gramáticas con las siguientes
restricciones:

1. No podrán aparecer dos símbolos no terminales


consecutivos en las producciones.
2. No podrán existir producciones a la cadena vacía.
EJEMPLO PRECEDENCIA DE
OPERADORES, CONSTRUCCIÓN DE ÁRBOL SINTÁCTICO.

precedence left or;


precedence left and;

INICIA::= C:value {: System.out.println(value.valor);


System.out.println :};

C::= C:ee1 or C:ee2{: RESULT=CrearNodo(“or","OPER");


RESULT=
CrearHoja(RESULT,ee1);
CrearHoja(RESULT,ee2); :}
| C:e1 and C:e2{: RESULT=CrearNodo(“and","OPER");
RESULT=
CrearHoja(RESULT,e1);
CrearHoja(RESULT,e2); :}
| true:TRUE{: RESULT=CrearNodo
CrearNodo(TRUE,“TRUE"); :}
| false:FALSE {: RESULT=CrearNodo
CrearNodo(FALSE,“FALSE"); :};
EJEMPLO:
true

or and

or false true true

fals
or
e

or and

or and and true

fals and fals false false


true
e e

fals
true
e
MÉTODOS ASCENDENTES

S
Partiendo del árbol de
derivación se comprueba
B c E F la siguiente cadena
abcdef
A b d D Partiendo de abajo hacia
arriba utilizando la pila
a C
y reduciendo las
e f
producciones

27/09/2010 12
MÉTODOS ASCENDENTES

S
Ingresa a la pila

a
B c E F
El análisis se hace de
A b d D
arriba hacia abajo.
C

e f
MÉTODOS ASCENDENTES

S
Reduce en la producción
Aa
B c E F
Cambia el valor en la pila
b d D

C A

e f

27/09/2010 14
MÉTODOS ASCENDENTES

S
Ingresa el valor de b a la
pila.
B c E F
A b
d D

e f

27/09/2010 15
MÉTODOS ASCENDENTES

S
Reduce en la producción
B  Ab
c E F
Cambia el valor en la pila
d D

C B

e f

27/09/2010 16
MÉTODOS ASCENDENTES

S
Se moviliza en el árbol e
ingresa c.
E F
Se agrega c a la pila
d D

C B c

e f

27/09/2010 17
MÉTODOS ASCENDENTES

S
Se moviliza en el árbol e
ingresa d.
E F
Se agrega d a la pila
D

C B c d

e f

27/09/2010 18
MÉTODOS ASCENDENTES

S
Se moviliza en el árbol e
ingresa e.
E F
Se agrega e a la pila
D

C B c d e

27/09/2010 19
MÉTODOS ASCENDENTES

S
Se moviliza en el árbol e
ingresa f.
E F
Se agrega f a la pila
D

C B c d e f

27/09/2010 20
MÉTODOS ASCENDENTES

S
Reduce en la producción
Cef
E F
Cambia el valor en la pila
D

B c d C

27/09/2010 21
MÉTODOS ASCENDENTES

S
Reduce en la producción
DC
E F
Cambia el valor en la pila

B c d D

27/09/2010 22
MÉTODOS ASCENDENTES

S
Reduce en la producción
Fε
F
Cambia el valor en la pila

B c E F

27/09/2010 23
MÉTODOS ASCENDENTES
Reduce en la producción
SBcEFε

Cambia el valor en la pila

27/09/2010 24
EJEMPLO
c --> c || C E -->
>E+E
| c && c | E-E
| E*E
| !c
| E/E
| (c) | (E)
| E == E | NUM
| E <> E | IDENTIFICADOR
| E <= E | CADENA
| E >= E
| E<E
| E>E
| TRUE
| FALSE;
GRAMÁTICAS DESCENDENTES

Son reconocedores de estructuras sintácticas derivables por


la derecha. Se conocen como

1. Parser Up Botom

Las gramáticas descendente al contrario de las ascendentes


intenta utilizan un reconocedor de cadenas de entrada que
comienzan por la raíz y se deriva hasta las hojas.

Se puede considerar este proceso como de desplazar una


cadena hasta al final y a continuación empezar a reducirla.
FUNCIONAMIENTO
Gramática Entrada para la gramática
L r5
S-->L uno,dos,tres,cuatro,cinco
L r4
L-->id,L
| id L r3

L r2

L r1

uno , dos , tres , cuatr , cinco


d1 d2 d3 d4 d5 d6
od7 d8 d9
REESCRITURA DE GRAMATICAS
Las gramáticas descendentes deben cumplir con tres
condiciones

o Supresión de la Ambigüedad.
o Eliminación de la recursividad por la izquierda.
o Factorización por la izquierda.
izquierda

1. Es por ello que una gramática descendente puede ser una


reescritura de una gramática ascendente que cumpla con
las tres reglas enunciadas arriba.
SUPRESION DE LA AMBIGUEDAD
La supresión de la ambigüedad puede ser realizada de dos
formas diferentes:

1. Por precedencia de operadores


2. Por factorización por la izquierda

Para eliminarla por precedencia de operadores se procede:

1. Creando un nuevo no terminal por cada operador o conjunto de


operadores que tienen la misma precedencia
2. Sustituir en la gramática de operador del lado derecho el
nuevo terminal creado y ununa producción alternativa con el
mismo no terminal.
SUPRESIÓN DE LA AMBIGÜEDAD(EJEMPLO)
Partiendo de un ejemplo de una
a gramática ascendente para las
expresiones condicionales.
Produciones
S--> C
C-->
> C && C
C-->
> C || C
C -->
> !C
C -->
> (C)
C -->
> TRUE
C -->
> FALSE
>E==E
C-->E==E

Donde se acuerda que el símbolo ‘||’ es el de menor


precedencia seguido por el símbolo ‘&&’, el símbolo ‘!’
le sigue y por ultimo las palabras reservadas TRUE Y FALSE.
SUPRESIÓN DE LA AMBIGÜEDAD
(NUEVO NO TERMINAL)
Lista de no terminales en orde
den de precedencia de menor a
mayor.

Operador Nuevo Terminal


|| X
&& V
! Y
TRUE,FALSE Z
SUPRESIÓN DE LA AMBIGÜEDAD
(SUSTITUCIÓN DEL NO TERMINAL)
Gramática final
Producciones
S -->
>C
C -->
> C || X
C -->> X
X -->X
>X && V
X -->V
V -->!Z
V -->Z
Z -->(C)
>(C)
Z -->TRUE
>TRUE
Z -->
> FALSE
FACTORIZACIÓN POR LA IZQUIERDA
La factorización por la izquierda,
a, encontrara todos los símbolos
comunes y los agrupara, eliminando la ambigüedad al quedar
factorizada la gramática. Un ejemplo a partir de la gramática
anterior.
Producciones
S--> C
C-->CC’
> && C
C’->
(factorizada
factorizada)
C’-->
> || C
(factorizada
factorizada)
C -->
> !C
C -->
> (C)
C -->
> TRUE
C -->
> FALSE
ELIMINACIÓN DE LA RECURSIVIDAD
La eliminación de la recursividad es realizada en base a una
regla que se ilustra a continuación:

Recursiva por la Aplicando la Regla


izquierda
A--> A α1 A
 β A’
A--> A α2 A’  α1A’
… A’  α2A’
A--> A αn …
A
 β A’  αnA’
A’  ε
ELIMINACIÓN DE LA RECURSIVIDAD(EJEMPLO)
Siguiendo con el ejemplo nos damos cuenta que aun tiene
recursividad por la izquierda por lo que procedemos a aplicar
esta regla para quitarla.
Producciones
S --> C
C --> > X C’
C’ -->
> || X C’
C’ --> ε
X -->V V’’
V’-->
> && V V’
V’ -->ε
V -->!Z
V -->Z
Z -->(C)
Z -->TRUE
>TRUE
Z -->
> FALSE

Vous aimerez peut-être aussi