2. CONTENIDO
• GRAMÁTICA
• TIPOS DE DERIVACIONES: Derivación Derecha ,Izquierda
• REPRESENTACIONES GRÁFICAS: ÁRBOLES SINTÁCTICOS
• VACUIDAD
• RECURSIVIDAD
• GRAMÁTICA REDUCIDA
SUPRESIÓN DE SÍMBOLOS INÚTILES
• GRAMÁTICA PROPIA
• REGLA LAMBDA
• REGLAS UNITARIAS
• FORMAS NORMALES
• FORMA NORMAL DE CHOMSKY
• FORMA NORMAL DE GREIBACH
3. GRAMÁTICA
En la figura siguiente se describe la sintaxis o estructura de la sentencia descomponiéndola en
sus partes constitutivas. Así vemos que la <sentencia> se compone de un <sujeto> seguido
de un <predicado>; que el <sujeto> a su vez se compone de un <artículo> seguido de un
<adjetivo> seguido de un <nombre>, etc. Esta descomposición descendente llega a un nivel
de detalle donde se describen los símbolos literales que aparecen en la frase en español.
<sentencia>
┌──────────────┴────────────────────┐
<sujeto> <predicado>
┌──────┴───┬─────────────┐ ┌────────┴────┐
│ │ │ │ < objeto>
│ │ │ │ ┌───┴────┐
<artículo> <adjetivo> <nombre> <verbo> <artículo> <nombre>
│ │ │ │ │ │
el gran elefante salta la banca
4. <sentencia> --> <sujeto><predicado>
<sujeto> --> <artículo><adjetivo><nombre>
<artículo> --> el | la
<adjetivo> --> gran
<predicado> --> <verbo> <objeto>
<verbo> --> salta
<objeto> --> <artículo> <nombre>
<nombre> --> banca
<nombre> --> elefante
Cada una de las líneas de la figura se llama regla de reescritura
consiste en una parte izquierda y una derecha, conectadas por una
flecha. La parte derecha de estas reglas representa una descripción más
detallada de la parte izquierda. Así, podemos decir que la figura
anterior describe de manera jerárquica la estructura de una sentencia
(frase), comenzando con el símbolo de inicio <sentencia>.
Esta colección de símbolos y palabras básicas, junto con el símbolo de
inicio y un conjunto finito de reglas de reescritura, se denomina
gramática.
5. DEFINICIÓN.-
Una gramática está formada por el cuarteto
G = <X, N, P, S> siendo cada uno de sus elementos:
X: es el alfabeto terminal. Todas las sentencias del
lenguaje definido por esta gramática están formados con los símbolos o
caracteres de X.
N: es el alfabeto o vocabulario no terminal, tal que
N_X=φ. Son símbolos auxiliares para la definición de la gramática y
que no figuran en las sentencias del lenguaje. También a los elementos
de N se les denomina así: metanociones, variables o no-terminales.
P: es un conjunto finito de reglas de "producción o
derivación" de las tiras, que tiene la forma:
tira1 ───> tira2
(S,m)εP, SεN, mε(N^X)*
S: es la metanoción más importante del conjunto
N, se le llama "símbolo distinguido, símbolo inicial o axioma".
6. EJEMPLO: La gramática G, que define todas las tiras formadas por
varias a seguidas de igual número de b .
G = <X, N, P, S>
X = {a,b}
N = {S}
P :
S --> aSb
S --> ab
7. DEFINICIÓN.- El lenguaje definido por una gramática G que se
indica L(G,S), es el conjunto de tiras de símbolos terminales
generadas partiendo del axioma S empleando las reglas del
conjunto P. Para realizar esta generación o transformación desde el
axioma a la sentencia o tira de símbolos terminales, tendremos que
examinar los operadores ==> y ==>* empleados para derivar
sentencias de una gramática.
EJEMPLO: De la gramática G1 encontrar la derivación asociada de
la cadena de entrada aaaabbbb.
S ==> aSb ==> aaSbb ==> aaaSbbb ==> aaaabbbb
8. TIPOS DE DERIVACIONES
DEFINICIÓN.- "Derivación Izquierda“
Se llama así a la derivación realizada sustituyendo, en la
forma sentencial dada, la metanoción de "más hacia la
izquierda" por alguna de sus partes derechas que la
definen (naturalmente de las reglas de P), es decir:
v ==>* f es izquierda si se escribe
go= v1g1g2....gn = f con gi ==> gi+1
donde
gi= mivimi' con miεX* y gi+1= mihimi'
10. DEFINICIÓN.- "Derivación Derecha"
De forma análoga se define "derivación derecha" si las
sustituciones que se van realizando en la forma sentencial
son siempre en la metanoción de "más hacia la derecha", es
decir:
mi'εX*
11. EJEMPLO: G= <X, N, P, S>
X = {a, .. ,z, =}
N = {<derecha>, <letra>}
S = {<derecha>}
P: ┌
│ <derecha> --> <letra> = <derecha>
│ <derecha> --> <letra>
│ <letra> --> a | b | ... | z
└
Encontrar: <derecha> ==>⁺ a = b = c
<derecha> ==> <letra> = <derecha> ==> <letra> = <letra> =
<derecha> ==> <letra> = <letra> = <letra> ==> <letra> = <letra>
= c ==> <letra> = b = c ==> a = b = c
12. EJERCICIO: Sea la gramática siguiente, construir las derivaciones
izquierdas y derechas para
A ==>⁺ abc
G= <X, N, P, S>
X = {a, b, c}
N = {A, B, C, E, F}
S = {A}
P: ┌
│ A --> BF
│ B --> EC
│ E --> a
│ C --> b
│ F --> c
└
Desarrollo:
(1) A ==>i BF ==>i ECF ==>i aCF ==>i abF ==>i abc
(2) A ==>d BF ==>d Bc ==>d ECc ==>d Ebc ==>d abc
13. REPRESENTACIONES GRÁFICAS: ÁRBOLES SINTÁCTICOS
Los árboles sintácticos son una ayuda para comprender la sintáxis
de las sentencias.
DEFINICIÓN.- Sea G= <X, N, P, S>, α es una árbol de
derivación correspondiente a la derivación:
m1 =====> m2 =====> .... =====> mpk
(i1,p1) (i2,p2) (ik-1, pk-1)
((ij, pj) significa la aplicación de pj sobre el
no-terminal ij de mj)
si: . p1 es su raiz
. por todo nodo pi, sus sucesores son
de izquierda a derecha las reglas utilizadas para derivar los no
terminales en su miembro derecho.
14. EJEMPLOS:
1) G= <X, N, P, S>
X = {a}
N = {S}
P:
P1: S --> SS
P2: S --> a
a) S ==>i SS ==>i SSS ==>i aSS ==>i aaS ==>i aaa
P1
P1 P2
P1 P2
b) S ==>d SS ==>d SSS ==>d SSa ==>d Saa ==>d aaa
P1
P2 P1
P2 P2
15. 2) G= <X, N, P, S>
X = {+, *, (, ), a}
N = {E}
S = {E}
P :
│ P1: E --> E + E
│ P2: E --> E * E
│ P3: E --> (E)
│ P4: E --> a
a) E ==>i E * E ==>i E + E * E ==>i a + a * a
P2
P1 P4
P4 P4
b) E ==>d E + E ==>d E + E * E ==>d a + a * a
P1
P4 P2
P4 P4
16. AMBIGÜEDAD
Al construir el árbol sintáctico de una sentencia no nos ha
preocupado el orden en que se aplicaban las derivaciones o
reglas. Lo que si es esencial es que cada sentencia de un lenguaje
tenga un único árbol sintáctico. En caso contrario, una sentencia
escrita por el programador se podría "entender" de varias formas
por el compilador, con funestos resultados.
DEFINICIÓN.- G= <X, N, P, S> es "ambigua" si existe una
palabra del lenguaje engendrado por dos árboles de derivación de
estructura diferente.
NOTA: Si G es ambigua no implica que L(G,S) sea
ambiguo.
17. EJEMPLO: Probar que la gramática de las expresiones
aritméticas, Ges ambigua.
Desarrollo:
Para la palabra: "a+a*a" se pueden tener dos árboles
sintácticos de estructura diferente.
E E
│ │
E │ E E │ E
│ │ │ │ │ │
│ │ E │ E E │ E│ │
│ │ │ │ │ │ │ │ │ │
a + a * a a + a * a
NOTA: Cambiando una gramática ambigua, por supuesto sin
cambiar sus sentencias, se puede a veces obtener una gramática
no ambigua para el mismo conjunto de sentencias. Sin embargo,
hay lenguajes que no tienen una gramática no ambigua; tales
lenguajes se llaman "ambiguos intrínsecos".
18. RECURSIVIDAD
DEFINICIÓN.- En general, si A ==>+ ...A..., decimos que la gramática es
recursiva en A.
Si se cumple A ==>+ A..., se llama "recursiva por la
izquierda" y si A ==>+ ...A se llama "recursiva por la derecha". Una regla
se llama recursiva por la "izquierda-derecha", si tiene la forma:
A --> A... (o bién A --> ...A).
NOTA: Si un lenguaje es infinito, una gramática que lo defina debe ser
recursiva, con número limitado de reglas de producción.
Hay muchas metanociones (la mayoría) de un lenguaje de
programación que tienen una estructura recursiva; algunos casos son:
. parte izquierda de la sentencia de asignación múltiple;
. lista de parámetros de un procedimiento;
. estructura de bloque o sentencia compuesta;
. sentencia condicional y de bucle;
. dimensionado de una array;
. en las expresiones aritméticas: término, factor, primario.
19. EJEMPLO:Se desea escribir la definición de <tren> que estará formado por una
<locomotora> solamente, o bién por una locomotora seguida (concatenada
diremos aquí) por uno o más vagones. Entonces según la notación ya sabida de
las reglas BNF, se puede escribir las reglas de producción P como:
P:
│ <tren> --> <locomotora>
│ <tren> --> <locomotora><vagón>
│ <tren> --> <locomotora><vagón><vagón>
│ <tren> --> <locomotora><vagón><vagón><vagón>
└
si nos conformamos con escribir las 4 reglas anteriores, entonces según
ellas, un tren estará formado por una locomotora sólo, o bién por una
locomotora seguida por uno, dos, tres vagones.
Pero introduciendo la "recursividad" se reduce el número de reglas BNF
necesarias para definir la variable o metanoción. Entonces se puede escribir las
dos reglas siguientes:
┌
│ <tren> --> <locomotora>
│ <tren> --> <tren><vagón>
└
20. GRAMÁTICA REDUCIDA
DEFINICIÓN.- Una gramática G= <X, N, P, S> se dice
reducida con respecto a un no-terminal S, si las dos condiciones
siguientes son satisfechas:
1) Para todo SεN, LG(S) = φ (Ningún nodo terminal engendra
el lenguaje vacio o nulo).
2) Para todo SεN, m1,m2 ε (X ^ N)* * So ==>* m1Sm2 (Todos
los no-terminales son accesibles y terminables).
Una gramática se dice "reducida" si es reducida con respecto al
axioma.
PROPOSICIÓN.- Por toda gramática algebraica, existe una
gramática reducida equivalente que se puede construir.
21. VACUIDAD DEL LENGUAJE
Algoritmo:
Nviejo = φ = {}
Nuevo = {A * (A --> t)εP y se cumple (tεX*)}
WHILE Nuevo <> Nviejo DO
Nviejo = Nuevo
Nuevo = Nviejo ^ {B * (B --> α)εP y αε(X ^ Nviejo)*}
END
IF S ε Nuevo THEN vacio = "no" ELSE vacio = "si" END
SUPRESIÓN DE SÍMBOLOS INÚTILES
Sea G= <X, N, P, S>. Diremos que un símbolo T es "útil", si tenemos las
dos cadenas de derivaciones S ==>* αTβ ==>* t, sino T es "inútil". Se
tienen pues dos aspectos para la utilidad de un símbolo:
1) Se debe poder derivar alguna tira terminal del símbolo T, si es así
se dice que T es "terminable".
2) T debe aparecer en alguna tira o forma sentencial derivable del
axioma S: le llamamos entonces "accesible".
22. SUPRESIÓN DE SÍMBOLOS INÚTILES
Sea G= <X, N, P, S>. Diremos que un símbolo T es "útil", si tenemos las dos cadenas de
derivaciones S ==>* αTβ ==>* t, sino T es "inútil". Se tienen pues dos aspectos para
la utilidad de un símbolo:
1) Se debe poder derivar alguna tira terminal del símbolo T, si es así se dice que
T es "terminable".
2) T debe aparecer en alguna tira o forma sentencial derivable del axioma S: le
llamamos entonces "accesible".
Pasos:
a) El primer paso es seguir el algoritmo de vacuidad, en el que dada la gramática
G= <X, N, P, S> que sea L(G)<>φ, se halle una gramática equivalente G'= <X, N', P',
S> tal que para cualquier A de N' se tiene tεX* para la que
A ==>* t.
Es decir, que sólo conservamos los símbolos "terminables".
Algoritmo:
IF LG(S) <> φ THEN
G'= <X, N', P', S>
N'= Nuevo
P'= N'^ X (Conjunto de todas las reglas cuyos símbolos
están en N'^ X).
END
23. b) El segundo paso es el de quedarnos sólo con los símbolos "accesibles".
Dada la gramática G= <X, N, P, S> (la resultante del paso anterior),
hallar otra G'= <X', N', P', S>, tal que cualquier símbolo T de (N'^X') existe
α,βε(X'^N')* tal que S ==>* αTβ.
En resumen, un símbolo (terminal o no) es inaccesible sino aparece
en ninguna forma sentencial del conjunto D(G).
Algoritmo:
Nviejo = {S}
Nuevo = {T * (S --> αTβ)εP}
WHILE Nviejo <> Nuevo DO
Nviejo = Nuevo
Nuevo = Nviejo ^ {Y * (A --> αYβ)εP y AεNviejo}
END
N' = Nuevo _ N
X' = Nuevo _ X
(* P' es el nuevo conjunto de reglas cuyos símbolos están todos en N'
y X' *)
24. EJEMPLO: Sea la gramática:
G13= <X, N, P, S>
X= {a, b, c}
N= {S, A, B, C, D}
P S --> aAAA
A --> aAb
A --> aC
B --> BD
B --> Ac
C --> b
Desarrollo:
1) Aplicaremos el algoritmo de vacuidad del lenguaje.
Nviejo Nuevo
1.- {} {C}
2.- {C} {C,A}
3.- {C,A} {C,A,B,S}
4.- {C,A,B,S} {C,A,B,S}
entonces SεNUEVO y LG(S) <> φ
25. 2) Aplicamos el algoritmo de selección de metanociones terminables.
Como LG(S) <> φ entonces
G'= <X, N', P', S>
N'= Nuevo = {S, A, B, C}
Como la metanoción D no es terminable entonces
P‘ S --> aAAA
A --> aAb
A --> aC
B --> Ac
C --> b
3) Eliminar los símbolos inaccesibles.
Nviejo Nuevo
1.- {S} {S,A,a}
2.- {S,A,a} {S,A,C,a,b}
3.- {S,A,C,a,b} {S,A,C,a,b}
la gramática resultante tiene pues:
G'= <X', N', P', S> siendo:
X'= {a, b}
N'= {S, A, C}
P': S --> aAAA
A --> aAb
A --> aC
C --> b
26. GRAMÁTICAS PROPIAS
DEFINICIÓN.- Sea G= <X, N, P, S> se dice propia si
no hay reglas de la forma:
1) A --> λ (regla vacia o regla Lambda)
2) A --> A' A,A'εN (regla unitaria)
27. REGLAS LAMBDA
Se llama Lambda a una regla del tipo A --> λ. Si resulta que λ
forma parte de LG(S), entonces no se podrá eliminar todas las
reglas λ de la gramática, pero si no es así si podemos hacerlo. La
forma de hacerlo es hallando para cada variable A si se tiene que
A ==>* λ, en cuyo caso se dice que A es "anulable".
Se dice que una gramática es "sin_λ", si cumple una de las dos
condiciones siguientes:
1) no hay ninguna regla λ de P;
2) hay sólo una regla λ asociada al axioma S --> λ y además S
no aparece en la parte derecha de ninguna regla de P.
28. Algoritmo:
Nviejo = {} = φ
Nuevo = {A * (A --> λ)εP}
WHILE Nviejo <> Nuevo DO
Nviejo = Nuevo
Nuevo = Nviejo ^ {B * (B --> α), y todos los símbolos de α son
anulables}
END
29. Ahora se forma el conjunto de reglas P' como sigue:
a) Si A --> αoB1α1B2α2...Bkαk ε P, k>0, y cada Bi es anulable,
mientras que en las αi no hay ninguna anulable, entonces añadamos
a P' todas las reglas de la forma
A --> αoX1α1X2α2...Xkαk, siendo Xi bien Bi o λ, sin añadir la
regla A --> λ a P', lo que ocurriría si todas las α fueran λ.
b) Si el axioma S es anulable, entonces λ pertenece al lenguaje y
para aislarla añadimos a P' la regla
S' --> λ | S
en cuyo caso se amplia N con S'.
La gramática tendrá P' como conjunto de reglas de la misma. Y
el vocabulario N es el mismo, salvo el caso b) en que aparece un
nuevo axioma y queda λ separada.
30. EJEMPLO:
1) Sea G= <X, N, P, S> siendo:
X= {a, b, c}
N= {S, U, T}
┌
P: │ S --> aSbScT
│ S --> UU
│ U --> λ
└
Nviejo Nuevo
1.- {} {U}
2.- {U} {U,S}
3.- {U,S} {U,S}
N'= {S', S, T, U}
┌
│ S' --> λ * S
P': │ S --> aSbScT
│ S --> abScT
│ S --> aSbcT
│ S --> abcT
│ S --> UU
│ S --> U
└
31. REGLAS UNITARIAS
Se llama regla unitaria a la que tiene el formato A --> B. Demos un
algoritmo que partiendo de una gramática sin_λ, la transforme
en otra equivalente sin reglas unitarias. A continuación se
determinan los conjuntos NA para cada AεN con las
metanociones B tales que A ==>* B
Algoritmo:
Nviejo = {} = φ
Nuevo = {A * (A --> B)εP, A,BεN} (* regla unitaria *)
WHILE Nviejo <> Nuevo DO
Nviejo = Nuevo
Nuevo = Nviejo ^ {C * (B --> C)εP, y B está en Nviejo}
END
NA = Nuevo
Una vez determinado el conjunto NA para cada metanoción, se
construye P' como sigue: Si B --> α está en P y no es una regla
unitaria, poner A --> α en P' para todas las A para las que B esté
en NA.
32. EJEMPLO:
1) Suprimir de la gramática siguiente las reglas unitarias:
G12= <X, N, P, S>
X= {a, +, *, (, )}
N= {E, T, F}
S= {E}
┌
P: │ E --> E+T
│ E --> T
│ T --> T*F
│ T --> F
│ F --> (E)
│ F --> a
└
Nviejo Nuevo Nviejo Nuevo
1.- {} {E} 1.- {} {T}
2.- {E} {E,T} 2.- {T} {T,F}
3.- {E,T} {E,T,F} 3.- {T,F} {T,F}
4.- {E,T,F} {E,T,F}
NE= {E,T,F} NT= {T,F} NF= {F}
Luego la gramática resultante es:
G'12= <X', N', P', S>
X'= X = {a, +, *, (, )}
N'= N = {E, T, F}
S = {E}
┌
P': │ E --> E+T * T*F * (E) * a
│ T --> T*F * (E) * a
│ F --> (E) * a
└
33. FORMAS NORMALES
Sucede con frecuencia en lingüistica matemática que
se hace casi imprescindible que las gramáticas se
hallen dispuestas de alguna forma especial, que aún
sin cambiar el lenguaje generado (o sea que es una
gramática equivalente a la dada), haga más fácil su
proceso ulterior.
A continuación vemos las dos formas normalizadas
más frecuentes que se emplean en lenguajes formales y
en sus aplicaciones.
34. FORMA NORMAL DE CHOMSKY (FNC)
Una gramática se dice que está en la "Forma Normal de
Chomsky o Cuadrática" si sus reglas tienen una de
estas dos formas:
A --> BC
A --> a
siendo A,B,CεN y aεX.
Una gramática se puede poner siempre en formato
FNC. El algoritmo siguiente ilustra la conversión, para
la que se supone que la gramática de entrada es propia
y sin reglas unitarias.
35. Algoritmo:
P' = {} = φ
añadir a P' todas las reglas de la forma A --> BC;
añadir a P' todas las reglas de la forma A --> a;
(* transformación *)
IF [A --> T1T2..Tk]εP and k>2 THEN
añadir a P' las reglas:
A --> T'1<T2..Tk>
<T2..Tk> --> T'2<T3..TK>
.......
<Tk - 1Tk> --> T'k - 1T'k
(* en las que T'i coincide con Ti si ésta es metanoción *)
END
IF [A --> T1T2]εP and T1εX or T2εX THEN
añadir a P' la regla: A --> T'1T'2
END
(* lo anterior se realiza para todas las reglas de P para todas las nuevas
metanociones a' se añade a P' una regla
a' --> a *)
De esta forma se tienen las nuevas reglas de P'. El conjunto N' es el N al que se
la añaden las nuevas metanociones creadas. Podemos decir que las dos
gramáticas (la de entrada y la convertida) son equivalentes o generan el mismo
lenguaje.
36. EJEMPLO: La gramática siguiente poner en formato FNC:
G1ç= <X, N, P, S>
X= {0, 1}
N= {S, A, B}
┌
P: │ S --> BA
│ A --> 01AB0
│ A --> 0
│ B --> 1
└
Aplicando el algoritmo anterior, se tiene que las reglas
S --> BA, A --> 0 y la B --> 1 ya están en FNC. Para la restante regla:
regla transformada se añade a P'
A --> 01AB0 A --> A1A2 A1 --> 0
A2 --> 1AB0 A2 --> A3A4 A3 --> 1
A4 --> AB0 A4 --> AA5
A5 --> B0 A5 --> BA6 A6 --> 0
luego:
37. N'= {S, A, B, A1, A2, A3, A4, A5, A6} y las reglas de
┌
P': │ S --> BA
│ A --> A1A2
│ A2 --> A3A4
│ A4 --> AA5
│ A5 --> BA6
│ A --> 0
│ B --> 1
│ A1 --> 0
│ A3 --> 1
│ A6 --> 0
└
como se observa las tres parejas de metanociones (B,A3), (A,A1) y (A,A6) coinciden en su
definición, entonces finalmente nos quedaría:
G'= <X, N', P', S>
X = {0, 1}
N'= {S, A, B, A2, A4, A5}
┌
P': │ S --> BA
│ A --> AA2 * 0
│ A2 --> BA4
│ A4 --> AA5
│ A5 --> BA
│ B --> 1
38. FORMA NORMAL DE GREIBACH (FNG)
Ahora desarrollamos una notación muy interesante para
determinados tipos de reconocimientos sintácticos y es
la que tiene todas las reglas cuyas partes derechas
comienzan con un terminal, seguido opcionalmente de
variables, es decir, A --> aα, siendo AεN, aεX y α una
tira, posiblemente nula, formada por variables
solamente.
PROPOSICION.- Por toda gramática G= <X, N, P, S>
propia, existe una gramática en la "Forma Normal de
Greibach" equivalente que se puede construir.
Para conseguir esta transformación damos los
siguientes pasos:
39. EJEMPLO: Sea G= <X, N, P, S> poner en FNG, siendo:
X= {a, b}
N= {A1, A2, A3}
S= {A1}
┌
P:│ A1 --> A2A3
│ A2 --> A3A1 * a
│ A3 --> A1A2 * b
└
Desarrollo:
Paso a). Las partes derechas de A1 y A2 ya cumplen lo de comenzar con un terminal o una
variable de mayor numeración. Ataquemos la regla
A3 --> A1A2 y sustituyamos A1 por su valor que es la única alternativa
A2A3. Las reglas ahora son:
┌
│ A1 --> A2A3
│ A2 --> A3A1 * a
│ A3 --> A2A3A2 * b
└
como la primera alternativa de A3 sigue comenzando con una
variable de numeración inferior (A2), sustituimos ahora A2 por sus reglas que son A3A1 * a; las reglas
quedan así:
┌
│ A1 --> A2A3
│ A2 --> A3A1 * a
│ A3 --> A3A1A3A2 * aA3A2 * b
└
40. Paso b). Se trata de eliminar la recursividad por la izquierda de la regla
A3 --> A3A1A3A2 * aA3A2 * b
Introducimos la variable B3 y se cambian las reglas de
A3 a las:
A3 --> aA3A2B3 * bB3 * aA3A2 * b
B3 --> A1A3A2 * A1A3A2B3
el resto de las reglas de A1 y A2 no se alteran. Como
vemos que todas las partes derechas de A3 comienzan por un terminal, y se
emplean en sustituir a A3 en la regla
A2 --> A3A1 y luego se sustituyen las reglas-A2 en la
regla A1. Las reglas quedan así:
┌
│ A1 --> aA3A2A1A3 * bA1A3 * aA3A2B3A1A3 *
│ bB3A1A3 * aA3
│ A2 --> aA3A2A1 * bA1 *aA3A2B3A1 * bB3A1 * a
│ A3 --> aA3A2 * b * aA3A2B3 * bB3
│ B3 --> A1A3A2 * A1A3A2B3
└
41. Paso c).En el que se convierten las reglas de B3. Para ello se sustituyen las
5 alternativas de A1 en las dos alternativas de B3, dando 10 alternativas
para B3. La gramática queda con la nueva metanoción B3 en N' y las
reglas de P' son las siguientes:
La gramática resultante queda:
G'= <X, N', P', S>
N'= {A1, A2, A3, B3}
┌
P': │ A1 --> aA3A2A1A3 * bA1A3 * aA3A2B3A1A3 *
│ bB3A1A3 * aA3
│ A2 --> aA3A2A1 * bA1 * aA3A2B3A1 * bB3A1 *
│ a
│ A3 --> aA3A2 * b * aA3A2B3 * bB3
│ B3 --> aA3A2A1A3A3A2 * bA1A3A3A2 *
│ aA3A2B3A1A3A3A2 * bB3A1A3A3A2 *
│ aA3A3A2 *
│ aA3A2A1A3A3A2B3 * bA1A3A3A2B3 *
│ aA3A2B3A1A3A3A2B3 * bB3A1A3A3A2B3 *
│ aA3A3A2B3
└