Supongo que quiere decir convertirlo a una gramática formal con reglas de la forma V-> w, donde V es un no terminal y w es una cadena de terminales/no terminales. Para empezar, se puede decir simplemente (mezclando la sintaxis de expresiones regulares y CFG):
Donde S es el símbolo inicial. Ahora vamos a romper, en un poco (y añadir un espacio en blanco para mayor claridad):
S -> 0 A 1 0 B
A -> 1+
B -> (11)*
La clave es convertir *
es +
y es a la recursividad. En primer lugar, vamos a convertir la estrella de Kleene a un plus mediante la inserción de una regla intermedia que acepte la cadena vacía:
S -> 0 A 1 0 B
A -> 1+
B -> (empty)
B -> C
C -> (11)+
Por último, convertiremos +
notación para la recursividad:
S -> 0 A 1 0 B
A -> 1
A -> A 1
B -> (empty)
B -> C
C -> 11
C -> C 11
Manejar x?
, simplemente divídalo en una regla que produzca vacío y una regla que produzca x.
preguntan si existen útiles para esta tarea las implementaciones de bibliotecas de código abierto por ahora – matanster