Documentos de Académico
Documentos de Profesional
Documentos de Cultura
FORMALES
9
Introducción
En los lenguajes naturales, como el español, entendemos como gramática al conjunto de
reglas que nos permiten hablar y escribir correctamente, es decir, cómo se combinan las
palabras del lenguaje para formar oraciones. Por ejemplo:
Reglas gramaticales:
1. <oracion>::=<sujeto><predicado>
2. <sujeto>::=<articulo><sustantivo>
3. <predicado>::=<verbo><complemento>
4. <predicado>::=<verbo>
5. <articulo>::=el
6. <articulo>::=la
7. <sustantivo>::=perro
8. <sustantivo>::=gata
9. <verbo>::=corre
10. <verbo>::=come
11. <complemento>::=rápidamente
12. <complemento>::=mucho
El objetivo es llegar a tener una secuencia correcta de símbolos (en este caso son: el, la,
perro, gata, etc.) partiendo de un determinado símbolo, que llamamos inicial, (<oracion>
en el caso del ejemplo), y utilizando algunas de las reglas definidas.
A estas reglas se les conoce también como producciones o reglas de derivación. Una
producción definida sobre un alfabeto Σ, es el par ordenado de palabras (x,y) donde x,y ∈
Σ*, y se representa x::=y. Se dice que x es la parte izquierda de la producción y que y es la
parte derecha.
10
Ejemplo:
G = ( {c,d}, {S,A,T}, S, P ), P= { S ::= λ | cA, A ::= d | cA | Td, T ::= Td | d }
Gramáticas tipo 0
También se les llama gramáticas sin restricciones o recursivamente enumerables. Las
producciones de este tipo de gramáticas tienen la forma:
xAy ::= v donde A ∈ ΣN, x,y,v ∈ Σ*
Ejemplo:
AB1::=01BC, 1A::=DE0, B::=01, D::=0C, EA::=1
¿Qué pasa si agregamos la regla E::= λ?
Gramáticas tipo 1
También se les llama gramáticas dependientes del contexto. Las producciones de este tipo
de gramáticas tienen la forma:
xAy ::= xvy donde A ∈ ΣN, x,y ∈ Σ*, v ∈ Σ+
Todas las gramáticas de tipo 1 son también gramáticas de tipo 0, pero en este caso hay
una restricción añadida y es que no debe ser decreciente, es decir, no debe contener
producciones o reglas compresoras.
Se dice que una producción es compresora si la longitud de su parte derecha es menor
que la de la parte izquierda.
Ejemplo:
S::=aAB |aB, B::=Dc, CD::=CE, DE::=Dc, A::=aAC | aC, D::=b, CE::=DE, Cc::=Dcc
Si agregamos la regla EA::=c deja de ser tipo 1 y se convierte en tipo 0, ya que esta regla es
una regla compresora. |c| < |EA|
¿Qué pasa si agregamos la regla E::= λ?
Gramáticas tipo 2
También se les llama gramáticas libres de contexto o independientes de contexto. Las
producciones de las gramáticas tipo 2 son aún más restrictivas que las de tipo 1. En este
caso, la parte izquierda de la producción está formada por un único símbolo no terminal,
por lo tanto las producciones tienen la forma:
A ::= v donde A ∈ ΣN, v ∈ Σ*
Todas las gramáticas de tipo 2 son también gramáticas de tipo 1. En este tipo de
gramáticas, la conversión de A en v se realiza independientemente del contexto en que se
encuentre A, de ahí su nombre.
11
Ejemplo:
S::=aAB |aB, B::=Dc, D::=CE | b, E::=Dc, A::=aAC | aC, C::=DEAa
¿Qué pasa si agregamos la regla E::= λ?
Gramáticas tipo 3
Son el grupo más restringido de las gramáticas y también se les conoce con el nombre de
gramáticas regulares.
Al igual que las gramáticas tipo 2, este tipo de gramáticas tiene la restricción de que la
parte izquierda de la producción debe estar formada por un único símbolo no terminal,
pero además se añaden restricciones en la parte derecha de las producciones, que
deberán estar formadas por máximo dos símbolos.
Hay dos tipos de gramáticas regulares y sus producciones pueden ser de la siguiente
forma:
Estos dos grupos de gramáticas tienen el mismo poder generativo, es decir, cualquier
lenguaje de tipo 3 o lenguaje regular puede ser generado tanto por una gramática líneal
por la derecha como por una lineal por la izquierda.
Ejemplo:
S::=aA |aB, A::=aB | a, B::=b S es el símbolo inicial de la gramática
¿Qué pasa si agregamos la regla B::= λ? ¿Qué pasa si agregamos la regla S::= λ?
¿Cómo sería la gramática lineal por la izquierda?
Por lo tanto, las palabras del lenguaje estarán formadas por cadenas de símbolos
terminales generadas a partir del símbolo inicial de la gramática, utilizando las
producciones que la definen.
12
Gramáticas equivalentes
Dos gramáticas son equivalentes cuando generan el mismo lenguaje. Es evidente que,
para que esto suceda, deben estar definidas sobre el mismo ΣT.
No existen métodos generales para caracterizar los lenguajes pero se debe tener en
cuenta el orden en el que se aplicarían las composiciones y cuántas veces se usaría cada
una de ellas. La caracterización es una derivación general, que abarca todas las posibles
derivaciones en particular.
Ejemplo:
Caracterizar u obtener la el lenguaje que genera la gramática
G = { {a,b}, {S}, S, {S::=ab|aSb} }
S => ab
aSb => aabb
aaSbb => aaabbb
aaaSbbb => … anbn donde n>0
El lenguaje que genera es:
L(G) = {anbn | n > 0 }
Se recomienda usar árboles o cadenas de derivación para hacer el proceso más sencillo.
Cadenas de derivación
Las derivaciones o cadenas de derivación se utilizan para inferir las palabras que
pertenecen a un lenguaje. En éstas, el símbolo inicial se expande utilizando una de sus
producciones (es decir, mediante una producción cuya cabeza sea el símbolo inicial). A
continuación, expandimos la cadena resultante reemplazando uno de los símbolos no
terminales por el lado derecho de una de sus producciones, y así sucesivamente, hasta
obtener una cadena compuesta totalmente por símbolos terminales.
Ejemplo:
Sea la gramática definida por G = ({E,I},{a,b,0,1},R,E), con las reglas de producción
siguientes, que produce cadenas de expresiones algebraicas que involucran suma y
multiplicación.
13
E→I
E→E+E
E→E∗E
E → (E)
I→a
I→b
I → Ia
I → Ib
I→ I0
I→ I1
𝐸 ⇒ 𝐸 ∗ 𝐸 ⇒ 𝐼 ∗ 𝐸 ⇒ 𝑎 ∗ 𝐸 ⇒ 𝑎 ∗ (𝐸) ⇒ 𝑎 ∗ (𝐸 + 𝐸) ⇒ 𝑎 ∗ (𝐼 + 𝐸) ⇒ 𝑎 ∗ (𝑎 + 𝐸)
⇒ 𝑎 ∗ (𝑎 + 𝐼) ⇒ 𝑎 ∗ (𝑎 + 𝐼0) ⇒ 𝑎 ∗ (𝑎 + 𝐼00) ⇒ 𝑎 ∗ (𝑎 + 𝑏00)
De forma similar, se puede hacer que en cada paso se reemplace la variable más a la
derecha por uno de los cuerpos de sus producciones. En este caso, se trata de una
∗
derivación por la derecha y se utilizan ⇒ y ⇒ para indicar una o más derivaciones por la
𝑟𝑚
derecha, respectivamente.
E ⇒ E ∗ E ⇒ I ∗ E ⇒ a ∗ E ⇒ a ∗ (E) ⇒ a ∗ (E + E) ⇒ a ∗ (I + E) ⇒ a ∗ (a + E)
lm lm lm lm lm lm lm
14
Estas dos derivaciones son importantes porque cualquier analizador sintáctico o
compilador (es decir, un programa que trata de construir una derivación para una palabra
dada) debe utilizar una de ellas.
Árboles de derivación
Existe una representación de árbol para las derivaciones que ha demostrado ser
extremadamente útil. Este árbol muestra claramente cómo se agrupan los símbolos de
una cadena terminal en subcadenas, que pertenecen al lenguaje de una de las variables
de la gramática. Pero lo más importante es que el árbol, conocido como árbol de
derivación, cuando se emplea en un compilador, es la estructura de datos que representa
el programa fuente. En un compilador, la estructura del árbol del programa fuente facilita
la traducción del programa fuente a código ejecutable permitiendo que el proceso de
traducción sea realizado por funciones naturales recursivas.
Sea G = (V,T,P,S) una gramática. Los árboles de derivación para G son aquellos árboles que
cumplen las condiciones siguientes:
15