Sunteți pe pagina 1din 16

93

CAPITULO IV

4. LENGUAJES Y TIPOS DE GRAMATICAS

Aquí estudiaremos los diferentes tipos de gramáticas y la gramática generativa,


que es una técnica clave en el proceso de reconocimiento de cadenas que
cumplen con una estructura gramatical. Debemos tener en cuenta que mientras
los autómatas procesan cadenas, las gramáticas generan cadenas.

4.1. GRAMÁTICA
Para D. K. Rodrigo1 “La Gramática es el estudio de las reglas y principios que
regulan el uso de las lenguas y la organización de las palabras dentro de una
oración. También se denomina así al conjunto de reglas y principios que gobiernan
el uso de un lenguaje determinado; así, cada lenguaje tiene su propia gramática”

4.2. TIPOS DE GRAMATICA

Las gramáticas generativas fueron introducidas por Noam Chomsky en 1956


como un modelo para la descripción de los lenguajes naturales (español, inglés,
etc.). Chomsky clasificó las gramáticas en cuatro tipos: 0, 1, 2 Y 3. Las gramáticas
de tipo 2, también llamadas gramáticas independientes del contexto, se
comenzaron a usar en la década de los sesenta para presentar la sintaxis de
lenguajes de programación y para el diseño de analizadores sintácticos en
compiladores2.

1
D.K. Rodrigo. Teoría de la Computación: Lenguajes, Autómatas y Gramáticas. Colombia: Unilibros, 2004.
pp. 81.
2
IBIB, 81
93
94

TIPOS DE GRAMÁTICAS

4.2.1. GSR Tipo 0: Gramática sin restricciones Tipo 0.

4.2.2. GCSP: Gramática de Contexto Sensitivo Puro.

4.2.3. GCS Tipo 1: Gramática de Contexto Sensitivo Tipo 1

G’ = {
G={ es una GCSP.

4.2.4. GLCP :: Gramática Libre de Contexto Puro.

94
95

4.2.5. GLC Tipo 2: Gramática Libre de Contexto.

G’ = {
G={ es una GLCP.

4.2.6. GLD Tipo 3 :: Gramática Lineal Derecha Tipo 3

4.2.7. GRAMÁTICA INDEPENDIENTE DEL CONTEXTO Y SU


APLICACIÓN COMO RECONOCEDOR DE ESTRUCTURA
SINTACTICA
Una gramática independiente del contexto (GIC) es una especificación para la
estructura sintáctica de un lenguaje de programación. Este tipo de especificación
es muy similar a la especificación de un estructura léxica de un lenguaje utilizando
expresiones regulares, solo que una gramática independiente del contexto
involucra reglas de recursividad. La GIC también llamada gramática no contextual
o gramática de tipo 2.

1. Terminal: símbolo básico a partir del cual se pueden formar las cadenas,
ejemplo: una letra, palabra reservada, *, etc. Los terminales son elementos
de un alfabeto Σ .

95
96

2. No terminal: es una variable sintáctica que puede ser sustituida por una
terminal, una expresión u otra variable sintáctica. Se les puede llamar
también variables

3. Símbolo inicial: es un símbolo no terminal a partir del cual se origina la


gramática.
4. Producciones: son expresiones que asocian terminales y no terminales.
Una producción (A, w) y se lee “A produce w”; su significado es: la variable
A se puede reemplazar (sobre-escribir) por la cadena w. En la producción
A w, A se denomina la cabeza y w el cuerpo de la producción3.

Notación y definiciones. Las variables se denotan con letras mayúsculas A, B,


C,… Los elementos de Σ o símbolos terminales de denotan con letras minúsculas
a, b, c…

Cada producción o regla tiene el lado izquierdo una no terminal y del lado derecho
también llamado forma de frase puede tener una, terminal, una no terminal o una
concatenatción de terminales y no terminales así:

NT T
NT NT.T
NT T.NT
NT NT.NT
NT T.T

NT NT | NT. T| T.NT | También se puede representar así e caso de


que NT de la izquierda sea la misma
NT.NT | T.T

3
D.K. Rodrigo. Teoría de la Computación: Lenguajes, Autómatas y Gramáticas.
Colombia: Unilibros, 2004. pp. 83.

96
97

Se debe tener en cuenta:

En las gramáticas no van a existir cerraduras, las únicas operaciones permitidas


son la concatenación (.) y la unión (|).

El concepto utilizado es el de la recursividad.

Ejemplo 4.12.

La gramática Independiente del contexto del siguiente lenguaje L = { ab, aabb,


aaabbb…} es

S aSb | ab

Explicación

El (|) indica un (ó), es decir que podemos sustituir ya sea por la primera o la
segunda “expresión”, en este caso si entramos por la segunda “expresión”
encontraremos la primera cadena del lenguaje que es (ab).

Ahora si entramos por la primera “expresión”, es decir (aSb) tendremos una


recursividad en la no terminal (S) esto te lo desmenuzaremos de esta forma:

S aSb Cada vez que (S) se hace recursiva, esta llama a


S aSb a aSb b a (aSb) o (ab) y donde está la (S) reemplazo lo
que he llamado, en este caso estoy llamando
(aSb).

S aSb a aSb b aa aSb bb aaa aSb bbb

97
98

S aaa ab bbb

Se hace recursiva la (S) hasta cuando se genere la expresión que se quiere


alcanzar, le ponemos el tope final cuando llamamos la (S) y no entramos por la
primera expresión, sino por la segunda, es decir (ab) donde por su naturaleza de
terminal dará fin a la recursividad.

El lenguaje anterior lo podemos definir de otra forma, utilizando el (  ) para


finalizar la recursividad y no utilizaremos la cadena inicial (ab).

S aSb|  La diferencia de esta producción con la anterior


es que podemos obtener la cadena (  ) como inicial, ya que
en el (|) esta la opción de entrar inicialmente por el (  ) o
finalizar la recursidad en un momento. Dado.

Nota: Es importante que al tratar de resolver una gramática para un


lenguaje, se debe analizar donde se repite alguna cadena o en otras
palabras donde se hace recursivo el lenguaje, de esa forma determinar
donde se debe colocar la no terminal y donde hacer que termine la
recursividad.

4.2.7.1. Derivación

La sustitución de una no terminal por una no Terminal, una terminal o una


expresión se denomina derivación. Es la situación de un no terminal.

Izquierda

Derivación
Derecha

98
99

4.2.7.1.1. Derivación izquierda

Derivación izquierda: consiste en sustituir el NT más a la izquierda de la forma de


frase.

4.2.7.1.2. Derivación derecha

Derivación derecha: consiste en sustituir en NT más a la derecha de la forma de


frase.

Ejemplo 4.13.

S AccA S: símbolo inicial


A BA| 
B a|b|c

Derivación izquierda:

S AccA BAccA aAccA


S aBAccA abAccA abccA
S abcc

Derivación derecha:

S AccA Acc BAcc BBAcc


S BBcc Bbcc abcc

Ejemplo 4.14.

99
100

L= {ai b 2i , i>0}

{abb, aabbbb, aaabbbbbb, aaaabbbbbbbb,…}

S aAbb
A aAbb| 

Se recomienda crear una tabla con lo valores de (i) y poder ver las posibles
cadenas.
i ai b 2i
1 abb
2 aabbbb
3 aaabbbbbb

Tabla 4.1. Tabla de cadenas del lenguaje no regular L= {ai b 2i , i>0}

Ejemplo 4.15.

L= {ai b j / i,j>0 i>j}

S aaPb
P aPb|aP| 

Ejemplo 4.16

L= {ai b j c K / i=j o i=k i,j,k>=0}


S BA|D

100
101

B aBb| 
A cA| 
D aDc|C
C bC| 

Ejemplo 4.17.

Construya una gramática de todos las cadenas de 0 y 1 donde no aparece la


subcadena 011

S 0C|1B
C 0C| 1A| 
B 1B|0C| 
A 0C

4.2.7.2. Arboles de derivación y ambigüedad

4.2.7.2.1. Arboles de derivación


Un árbol con raíz es un tipo muy particular de grafo no-dirigido; está formado por
un conjunto de vértices o nodos conectados entre sí por arcos o aristas, con la
siguiente propiedad: existe un nodo especial, llamado la raíz del árbol, tal que hay
una única trayectoria entre cualquier nodo y la raíz.
De esta manera, la raíz se ramifica en nodos, llamados descendientes inmediatos,
cada uno de los cuales puede tener, a su vez, descendientes inmediatos, y así
sucesivamente.

La propiedad que caracteriza a un árbol garantiza que un nodo puede tener 0, 1, o


más descendientes inmediatos pero un único antecesor inmediato. El único nodo
que no tiene antecesores es la raíz. Los nodos que tienen descendientes, excepto
la raíz, se denominan nodos interiores. Los nodos que no tienen descendientes se
llaman hojas del árbol. En la terminología usualmente utilizada, los descendientes

101
102

de un nodo también se denominan hijos y los antecesores padres o ancestros. El


número de vértices (y por lo tanto, el número de arcos) de un árbol puede ser
infinito.
Algunos árboles.

Figura 4.1. Formas de arboles de derivación

4.2.7.2.2. Una gramática independiente del contexto no ambigua para


expresiones regulares

Gramática Independiente del contexto para evaluar una expresión aritmética que
contiene dígitos y el operador suma, es decir una expresión aritmética de suma.

P → P + P | dig

dig → 0|1|2|3…|9

Si tomamos la cadena 5+7+2 se pueden hacer las siguientes sustituciones. La no


terminal más a la izquierda P puede ser 5+7 y la P más a la derecha puede ser 2.
De tal forma que P → P + P , luego la primera P se puede sustituir por P+P ya
102
103

que la cadena 5+7 puede ser derivada, entonces queda P → P + P + P y por


último cada P se sustituye por dig de manera que quedaría P = dig + dig + dig
(Caso1). Pero también se podría escoger de la siguiente forma la no terminal más
a la izquierda P puede ser 5 y la P más a la derecha puede ser 7+2. De tal forma
que producción queda P→ P + P , luego la primera no terminal se puede sustituir
por dig y la segunda P por P + P ya que la cadena 5+7 puede ser derivada,
entonces queda P → P + P + P y por último cada P se sustituye por dig de
manera que quedaría P = dig + dig + dig (Caso2).

Caso1
P P+P
P P+P+P
P dig + dig + dig

Caso2
P P+P
P P+P+P
P dig + dig + dig

Como se encontraron dos formas para evaluar la cadena, esto indica que la
gramática es ambigua. En la sección siguiente se aborda el tema de ambigüedad.

4.2.7.2.3. Gramática de expresiones aritmética ambigua: una


gramática es ambigua cuando una cadena del lenguaje puede
ser representada por 2 árboles de análisis sintácticos
diferentes.

4.2.7.2.4. Árbol de análisis sintáctico

103
104

Indica gráficamente como a partir del símbolo inicial de la gramática se pueden


representar las cadenas del lenguaje.

La raíz es el símbolo inicia, los nodos interiores son las no terminales y las hojas
son las terminales.

Caso1
P P+P
P P+P+P
P dig + dig + dig

El árbol de Análisis Sintáctico es

Figura 4.6. Arbol de Análisis sintáctico descendente por izquierda

Caso2
P P+P
P P+P+P
P dig + dig + dig

El árbol de Análisis Sintáctico es

104
105

Figura 4.7. Arbol de Análisis sintáctico descendente por derecha

Como se observa se generaron dos árboles de análisis sintácticos a partir de la


misma cadena, eso indica que la gramática es ambigua.

Para eliminar la ambiguedad debemos hacer que la cadena solo puedar ser
reconocido por la gramática con una sola derivación, o sea que se pueda formar
un solo árbol.

La gramática ambigua es

P → P + P | dig
dig → 0|1|2|3…|9

Para quitar la ambiguedad cambiamos la no terminal P que está más a la derecha


por la terminal dig, entonces la gramática queda así.

Este árbol es descendente por


P → P + dig izquierda
dig → 0|1|2|3…|9

105
106

Ahora si evaluamos la misma cadena (5+7+2). Solo hay una forma de escoger P,
que es 5+7 y dig es 2, por lo tanto la siguiente derivación es por P de manera que
resultaría un árbol descendente por izquierda.

P → P + dig
P → P + dig + dig
P → dig + dig + dig

El árbol de Análisis sintáctico es.

Ahora se mejorará la gramática incluyendo el signo negativo, paréntisis y


manteniendo la gramática no ambigua

P P + T|P – T|T
T (P) |dig

Para evaluar la cadena (5+7)-2 se tiene la siguiente representación

P P–T
P T–T
P (P) – dig

106
107

P (P+T) – dig
P (P+dig) – dig
P (T+dig) – dig
P (dig+dig) – dig

Para evaluar la cadena 5+(7-2) se tiene la siguiente representación

P P+T
P T + (P)
P dig + (P–dig)
P dig + (T–dig)
P dig + (dig–dig)

Para evaluar la cadena (5+7-2) se tiene la siguiente representación

P T
P (P)
P (P-T)
P (P+T-dig)
P (T+dig-dig)
P (dig+dig-dig)

Como se puede observar las cadenas anteriormente evaluadas solo tienen una
forma de ser representados a través de la gramática y por lo tanto solo se pueden
implementar mediante un árbol de análisis sintáctico, esto quiere decir que la
gramática es no ambigua.

Podemos seguir ampliado la gramática, ahora le incluimos la multiplicación y la


división y mantenemos la no ambigüedad.

P P + T|P – T|T

107
108

T T*K| T/k |K
K dig| (P)

Para evaluar la cadena 5+7*2 se tiene la siguiente representación

P P+T
P P+T*K
P T+K*dig
P K+dig*dig
P dig+dig*dig

Para evaluar la cadena 5*8/2 se tiene la siguiente representación

P T
P K*T
P K*T/K
P K*K/K
P dig*dig/dig

Es importante aclarar que en la gramática anterior se valida el orden de prioridad


de las operaciones aritméticas.

108