Quiero convertir una expresión regular ingresada por el usuario en un NFA para que luego pueda ejecutar el NFA en una cadena con fines coincidentes. ¿Cuál es la máquina mínima que se puede usar para analizar las expresiones regulares?
Supongo que debe ser un autómata push down porque la presencia de paréntesis significa la necesidad de contar y un DFA / NFA no puede realizar un conteo arbitrario. ¿Es correcta esta suposición? Por ejemplo, la expresión a (bc *) d requeriría un PDA para que la subexpresión entre paréntesis se maneje correctamente.
Respuestas:
Estás en lo correcto. Es fácil mostrar que la sintaxis de las expresiones regulares no es regular utilizando técnicas estándar .
Una posibilidad es usar un homomorfismo (contra el cual está cerrado) para deshacerse de todos los símbolos excepto los paréntesis, lo que te deja con el lenguaje Dyck que es bien conocido por no ser regular. En caso de duda, use el lema de bombeo en .( p ) pR E G (pag)pag
Dicho esto, probablemente no desee codificar un PDA a mano. Considere usar un generador de analizador sintáctico como ANTLR o byacc . Si, por otro lado, desea investigar el análisis de idiomas mediante la programación de analizadores usted mismo, debe continuar con otros algoritmos de análisis básicos como CYK , Earley , descenso recursivo y LR .
fuente
Le sugiero que lea la buena respuesta de Jukka a la pregunta " Emparejar expresiones regulares usando expresiones regulares " en teoría también. Un experto:
Esto es solo un enlace a una interesante "vista diferente" (según mi opinión) sobre el lenguaje de expresión regular; como se subraya en los comentarios a continuación, no es útil para construir un árbol de sintaxis. Si desea codificar manualmente su analizador, le sugeriré este sencillo artículo sobre el proyecto de código " Writing-own-regular-expression-parser ".
fuente