Tipos de gramatica y arboles de derivacion

17
“AÑO DE LA CONSOLIDACIÓN DEL MAR DE GRAU” UNIVERSIDAD NACIONAL DEL CALLAO FACULTAD DE INGENIERÍA INDUSTRIAL Y SISTEMAS ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS CURSO: COMPILADORES E INTÉRPRETES PROFESOR: EDDIE CHRISTIAN MALCA VICENTE INTEGRANTES: SEVERINO VICHARRA Jorge Luis BOULANGGER ALBERCA Elmer André HUAMANÍ TAIPE Jesús RODRIGUEZ SILVA Jhon 1

Transcript of Tipos de gramatica y arboles de derivacion

Page 1: Tipos de gramatica y arboles de derivacion

“AÑO DE LA CONSOLIDACIÓN DEL MAR DE GRAU”

UNIVERSIDAD NACIONAL DEL CALLAOFACULTAD DE INGENIERÍA INDUSTRIAL Y SISTEMAS

ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS

CURSO:

COMPILADORES E INTÉRPRETES

PROFESOR:

EDDIE CHRISTIAN MALCA VICENTE

INTEGRANTES:

SEVERINO VICHARRA Jorge Luis BOULANGGER ALBERCA Elmer André HUAMANÍ TAIPE Jesús RODRIGUEZ SILVA Jhon

AÑO

2016 – B

1

Page 2: Tipos de gramatica y arboles de derivacion

INDICE

1. TIPOS DE GRAMÁTICAS SEGÚN CHOMSKY 2

1.1. GRAMÁTICA TIPO 0 2

1.2. GRAMÁTICA TIPO 1 3

1.3. GRAMÁTICA TIPO 2 3

1.4. GRAMÁTICA TIPO 3 4

2. ÁRBOLES DE DERIVACIÓN 4

2.1. FUNCIÓN: 4

2.2. ESTRUCTURA: 5

2.3. PROPIEDADES: 52.3.1. EJERCICIO DE ÁRBOLES DE DERIVACIÓN: 6

2.4. RELACIÓN ENTRE DERIVACIONES Y ÁRBOLES 6

3. GRAMÁTICAS LIMPIAS Y BIEN FORMADAS 7

3.1. REGLAS INNECESARIAS 7

3.2. SÍMBOLOS INACCESIBLES 7

3.3. REGLAS SUPERFLUAS 7

3.4. ELIMINACIÓN DE SÍMBOLOS NO GENERATIVOS 8

3.5. ELIMINACIÓN DE REGLAS NO GENERATIVAS 8

3.6. ELIMINACIÓN DE REGLAS DE REDENOMINACIÓN 8

4. LENGUAJES NATURALES Y ARTIFICIALES 8

4.1. LENGUAJE NATURAL 8

4.2. LENGUAJE ARTIFICIAL 9

4.3. LENGUAJES DE PROGRAMACIÓN DE COMPUTADORAS 9

4.4. PROCESADORES DE LENGUAJE 9

4.5. PARTES DE UN PROCESADOR DE LENGUAJE 10

4.6. NOTA SOBRE SINTAXIS Y SEMÁNTICA 104.6.1. ANÁLISIS 104.6.2. ANÁLISIS LÉXICO 104.6.3. ANÁLISIS SINTÁCTICO 114.6.4. ANÁLISIS SEMÁNTICO 11

5. PREGUNTAS PROPUESTAS 112

Page 3: Tipos de gramatica y arboles de derivacion

1. TIPOS DE GRAMÁTICAS SEGÚN CHOMSKY

Las gramáticas se clasifican de acuerdo a las reglas de sustitución.

1.1. GRAMÁTICA TIPO 0 También llamada no restringida.

Figura 1. Ejemplo de gramática tipo 0.

“x puede ser sustituido por y si x está, ya sea, en los símbolos No Terminales o los símbolos Terminales, sin incluir la cadena vacía e y está en los símbolos No Terminales o Terminales, incluyendo la cadena vacía.”

Los lenguajes generados por este tipo de gramáticas se llaman "lenguajes sin restricciones"

Nota: "+" significa "sin incluir la cadena vacía" y "*" significa "incluyendo la cadena vacía". "/" significa "o"

Estos lenguajes también son denominados "recursivamente enumerarles".

Las máquinas que los aceptan son las máquinas de Turing (y equivalentes no deterministas)

1.2. GRAMÁTICA TIPO 1 También llamada sensible al contexto

Figura 2. Ejemplo de gramática tipo 1.

“α puede ser reemplazado por β si la longitud de α es menor o igual a la longitud de β, siendo α un símbolo Terminal o una cadena vacía z1, seguido de un símbolo No Terminal X, seguido de otro símbolo Terminal o una cadena vacía z2. En el caso de β, z1 debe ser el mismo símbolo z1 de α seguido de un símbolo No Terminal o Terminal sin ser la cadena vacía, seguido del símbolo z2.”

3

Page 4: Tipos de gramatica y arboles de derivacion

1.3. GRAMÁTICA TIPO 2También llamado Libre de contexto

Figura 3. Ejemplo de gramática de tipo 2.

“x puede ser reemplazado por y si x pertenece a los símbolos No Terminales e y es un Terminal o No Terminal, incluyendo la cadena vacía.”

Máquinas que los aceptan: Autómata a Pila (Pushdown Automaton)

1.4. GRAMÁTICA TIPO 3También llamado Regular

Figura 4. Ejemplo de gramática de tipo 3.

“α puede ser reemplazado por β si α pertenece a los símbolos No Terminales y β es uno de estos 3:

Un símbolo Terminal no nulo seguido de un No Terminal. Un símbolo No Terminal seguido de un símbolo Terminal no nulo. Un símbolo Terminal pudiendo ser la cadena vacía.”

Máquinas que los aceptan: autómata finito, determinista o no determinista.

4

Page 5: Tipos de gramatica y arboles de derivacion

2. ÁRBOLES DE DERIVACIÓN

2.1. FUNCIÓN:

Un árbol de derivación permite mostrar gráficamente como se puede derivar

cualquier cadena de un lenguaje a partir del símbolo distinguido de una gramática que

genera ese lenguaje

Fuente : Autoría Propia

2.2. ESTRUCTURA:

Un árbol es un conjunto de puntos, llamados nodos, unidos por líneas, llamados

arcos. Un arco conecta dos nodos distintos. Para ser un árbol un conjunto de nodos y arcos

debe satisfacer ciertas propiedades.

Hay un único nodo distinguido, llamado raíz (se dibuja en la parte superior) que no

tiene arcos incidentes.

Todo nodo c excepto el nodo raíz esta conectado con un arco a otro nodo k, llamado

el padre de c (c es el hijo de k). El padre de un nodo, se dibuja por encima de un nodo.

Todos los nodos están conectados al nodo raíz mediante un único camino. Los nodos

que no tienen hijos se denominan hojas, el resto de los nodos se denominan nodos

interiores.

5

Ilustración 1 Notación

Page 6: Tipos de gramatica y arboles de derivacion

Fuente : Autoría Propia

2.3. PROPIEDADES:

Sea G = (N,T,S,P) una gramática libre de contexto, sea una variable. Diremos que un

árbol TA = (N,E) etiquetado es un árbol de derivación asociado a G si verifica las

propiedades siguientes:

La raíz del árbol es un símbolo no terminal.

Cada hoja corresponde a un símbolo no terminal o λ.

Cada nodo interior corresponde a un símbolo no terminal.

Para cada cadena del lenguaje generado por una gramática es posible construir (al

menos) un árbol de derivación, en el cual cada hoja tiene como rotulo uno de los símbolos

de la cadena.

2.3.1. EJERCICIO DE ÁRBOLES DE DERIVACIÓN:

Sea G = (N,T,S,P) una GLC con P : S ab | aSb. La derivación de la cadena aaabbb será :

S ⇒ aSb ⇒ aaSbb ⇒ aaabbb y el árbol de derivación:

Fuente : Autoría Propia

2.4. RELACIÓN ENTRE DERIVACIONES Y ÁRBOLES

6

Ilustración 2 Nombres de los nodos

Ilustración 3 Árbol de derivación del ejemplo

Page 7: Tipos de gramatica y arboles de derivacion

Si leemos las ejecuciones de las hojas de izquierda a derecha tenemos una sentencia.

Llamamos a esta cadena la producción del árbol de derivación.

Derivación a la izquierda:

s ⇒ aAS ⇒ aSbAS ⇒ aabAS ⇒ aabba ⇒ aabbaa

Derivacion a la derecha:

s ⇒ aAS ⇒ aAa ⇒ aSbAa ⇒ aSbbaa ⇒ aabbaa

3. GRAMÁTICAS LIMPIAS Y BIEN FORMADAS

Una gramática se llama reducida si no contiene símbolos inaccesibles ni reglas

superfluas.

Se llama limpia si tampoco contiene reglas innecesarias.

3.1. REGLAS INNECESARIAS

En una gramática, las reglas de la forma U::=U son innecesarias y la hacen ambigua.

A partir de ahora se supondrá que una gramática no tiene tales reglas o, si las tiene, serán

eliminadas.

3.2. SÍMBOLOS INACCESIBLES

Supóngase que una gramática contiene una regla de la forma U::=x, donde U es un

símbolo no terminal, distinto del axioma, que no aparece en la parte derecha de ninguna

otra regla. Se dice que U es un símbolo inaccesible desde el axioma.

Figura 1. Ejemplo de Símbolos inaccesibles.

Para eliminar los símbolos inaccesibles, se hace una lista de todos los símbolos de la

gramática y se marca el axioma S. A continuación, se marcan todos los símbolos que

aparezcan en la parte derecha de cualquier regla cuya parte izquierda sea un símbolo

7

Page 8: Tipos de gramatica y arboles de derivacion

marcado. El proceso continúa hasta que no se marque ningún símbolo nuevo. Los símbolos

que se queden sin marcar, son inaccesibles.

3.3. REGLAS SUPERFLUAS

El siguiente algoritmo elimina los símbolos superfluos:

Marcar los símbolos no terminales para los que exista una regla U::=x, donde x sea una

cadena de símbolos terminales, o de no terminales marcados.

Si todos los símbolos no terminales han quedado marcados, no existen símbolos

superfluos en la gramática. Fin del proceso.

Si la última vez que se pasó por el paso 1 se marcó algún símbolo no terminal, volver al

primer paso.

Si se llega a este punto, todos los símbolos no terminales no marcados son superfluos.

3.4. ELIMINACIÓN DE SÍMBOLOS NO GENERATIVOS

Sea la gramática independiente del contexto G =(ΣT, ΣN, S, P). Para cada símbolo

A∈ΣN se construye la gramática G(A)=(ΣT, ΣN, A, P). Si L(G(A)) es vacío, se dice que A

es un símbolo no generativo. Entonces se puede suprimir A en ΣN, así como todas las

reglas que contengan A en P, obteniendo otra gramática más sencilla, que representa el

mismo lenguaje.

3.5. ELIMINACIÓN DE REGLAS NO GENERATIVAS

Se llaman reglas no generativas las que tienen la forma A::=λ. Si el lenguaje

representado por una gramática no contiene la palabra vacía, es posible eliminarlas todas.

En caso contrario, se pueden eliminar todas menos una: la regla S::=λ, donde S es el

axioma de la gramática. Para compensar su eliminación, por cada símbolo A de ΣN (A

distinto de S) tal que A→*λ en G, y por cada regla de la forma B::=xAy, añadiremos una

regla de la forma B::=xy, excepto en el caso de que x=y=λ.

3.6. ELIMINACIÓN DE REGLAS DE REDENOMINACIÓN

Se llama regla de redenominación a toda regla de la forma A::=B. Para compensar su

eliminación, basta añadir el siguiente conjunto de reglas:

Para cada símbolo A de ΣN tal que A→*B en G, y para cada regla de la forma B::=x,

donde x no es un símbolo no terminal, añadiremos una regla de la forma A::=x.

8

Page 9: Tipos de gramatica y arboles de derivacion

4. LENGUAJES NATURALES Y ARTIFICIALES

Los programadores se dan cuenta de esto cuando distinguen entre lenguajes

artificiales o programación y lenguajes naturales como el español y el inglés. En sí, la

palabra artificial nos dice algo sobre el plan del programador.

4.1. LENGUAJE NATURAL

Se llama lenguaje natural al que utilizan los seres humanos en su comunicación

ordinaria, porque ha sido formado paulatinamente mediante el uso del grupo social, a

través de una dinámica histórica no intencionada. Serían los distintos idiomas.

4.2. LENGUAJE ARTIFICIAL

Un lenguaje artificial es un lenguaje de programación que puede ser usado para

controlar el comportamiento de una máquina, especialmente una computadora. Estos se

componen de un conjunto de reglas sintácticas y semánticas que permiten expresar

instrucciones que luego serán interpretadas.

4.3. LENGUAJES DE PROGRAMACIÓN DE COMPUTADORAS

 Primera generación: Empezó en los años 1940-1950 en este lenguaje se utilizaba

códigos binarios, que eran representados ene secuencias de ceros y unos, y cada modelo de

ordenador tenía su propio código. Por eso se llama lenguaje máquina.

Segunda generación: A fines de los 50´ llamado también lenguaje simbólico, así

mismo propio de la máquina, permitían simplificar la escritura de las instrucciones y las

hacían más legibles.

Tercera generación: Hacia los años 60´ ya este es un nivel más alto de programación

que sustituyo los símbolos por los códigos independientes de la máquina.

4.4. PROCESADORES DE LENGUAJE

Dicho en forma simple, un compilador es un programa que puede leer un programa

en un lenguaje (El lenguaje fuente) y traducirlo en un programa equivalente en otro

lenguaje (el lenguaje destino).

9

Page 10: Tipos de gramatica y arboles de derivacion

Ilustración 4 Grafica de procesadores de lenguaje

Si el programa destino es un programa ejecutable en lenguaje máquina, entonces el

usuario puede ejecutarlo para procesar las entradas y producir salidas (resultados).

Un intérprete es otro tipo común de procesador de lenguaje. En vez de producir un

programa destino como una traducción, el intérprete nos da la apariencia de ejecutar

directamente las operaciones especificadas en el programa de origen (fuente) con las

entradas proporcionadas por el usuario,

4.5. PARTES DE UN PROCESADOR DE LENGUAJE

Ilustración 5 Grafica de partes de procesador de lenguaje

10

Page 11: Tipos de gramatica y arboles de derivacion

4.6. NOTA SOBRE SINTAXIS Y SEMÁNTICA

4.6.1. ANÁLISIS

El objetivo de esta etapa es obtener una representación de la entrada que nos permita

realizar

la síntesis o la interpretación con comodidad.

4.6.2. ANÁLISIS LÉXICO

En esta fase se analiza la entrada carácter a carácter y se divide en una serie de

unidades elementales: los componentes léxicos.

4.6.3. ANÁLISIS SINTÁCTICO

Partiendo de lo que ha recibido del analizador léxico, la tarea del analizador

sintáctico consiste en ir descubriendo las estructuras presentes en el código de acuerdo con

una gramática no contextual.

4.6.4. ANÁLISIS SEMÁNTICO

La última fase del análisis, el análisis semántico, toma como entrada el árbol

sintáctico y comprueba si, además de las restricciones sintácticas, se cumplen otras

restricciones impuestas por el lenguaje y que no pueden ser comprobadas mediante una

gramática no contextual.

5. PREGUNTAS PROPUESTAS

A) Sea x un palíndromo. ¿Es L=x* un lenguaje palindrómico?

B) En la misma gramática G2, demostrar que las sentencias i+i*i y i*i*i no son ambiguas. ¿Qué operador tiene precedencia en cada una de esas dos sentencias?

C) Limpiar la gramática G = ({i,+}, {Z,E,F,G,P,Q,S,T}, Z, {Z::=E+T,E::=E|S+F|T, F::=F|FP|P, P::=G, G::=G|GG|F, T::=T*i|i,Q::=E|E+F|T|S, S::=i})

D) Sea L un lenguaje palindrómico. ¿Es L-1 un lenguaje palindrómico? ¿Lo es L L-1?

E) En la gramática G2 del apartado anterior, dibujar árboles sintácticos para las derivaciones siguientes:

11

Page 12: Tipos de gramatica y arboles de derivacion

6. PROGRAMA DEMOSTRACIÓN DE ÁRBOLES DE DERIVACIÓN

#!/usr/bin/python# -*- coding:utf-8 -*-

lista_sentencias = []

num_sen = int(raw_input("Ingrese el numero de sentencias: "))

# INGRESA LAS SENTENCIAS QUE SE VAN A USARfor i in range(num_sen): lista1 = [] print ("Ingrese la sentencia ", i+1) sentencia = raw_input() print "" lista1.extend(sentencia) lista_sentencias.append(lista1)

num_elem = len(lista_sentencias)

lista_pivot = []lista_term = []

# SEPARA LOS NODOS TERMINALES DE LOS NO TERMINALESfor j in range(num_elem): rango_i = len(lista_sentencias[j]) for i in range(rango_i): if( lista_sentencias[j][i].isupper() == True ):

12

Page 13: Tipos de gramatica y arboles de derivacion

lista_pivot.append(lista_sentencias[j][i]) if( lista_sentencias[j][i].islower() == True): lista_term.append(lista_sentencias[j][i])

num_elem1 = int(len(lista_pivot))

print ""

cont = 0cont1 = 0

# ELIMINA LOS NODOS QUE SE REPITEN EN LAS SENTENCIASfor m in range(num_elem1): for k in range(num_elem1): if( m < num_elem1- cont): if( k < num_elem1-cont): if( m != k ): compa1 = lista_pivot[m] compa2 = lista_pivot[k] if( compa1 == compa2 ): cont += 1 lista_pivot.remove(compa2)

num_elem2 = len(lista_term)

for p in range(num_elem2): for l in range(num_elem2): if( p < num_elem2-cont1): if( l < num_elem2-cont1): if(p != l): compa1 = lista_term[p] compa2 = lista_term[l] if( compa1 == compa2): cont1 += 1 lista_term.remove(compa2)lista_term.remove("a")print ""print ("LOS NODOS NO TERMINALES SON: ", lista_pivot)print ""print ("LOS NODOS TERMINALES SON: ", lista_term)

13