Desejo converter uma expressão regular inserida pelo usuário em um NFA, para que eu possa executar o NFA em uma string para fins de correspondência. Qual é a máquina mínima que pode ser usada para analisar expressões regulares?
Suponho que deve ser um autômato push down, porque a presença de colchetes significa a necessidade de contar e um DFA / NFA não pode executar uma contagem arbitrária. Esta suposição está correta? Por exemplo, a expressão a (bc *) d exigiria um PDA para que a subexpressão entre parênteses seja manipulada corretamente.
formal-languages
parsers
regular-expressions
pushdown-automata
Phil Wright
fonte
fonte
Respostas:
Você está certo. É fácil mostrar que a sintaxe das expressões regulares não é regular usando técnicas padrão .
Uma possibilidade é usar um homomorfismo (que é fechada contra) para se livrar de todos os símbolos, mas os parênteses, que deixa você com a linguagem Dyck , que é bem conhecido por ser não-regular. Em caso de dúvida, use o lema Pumping na ( p ) p .R E G (p)p
Dito isto, você provavelmente não deseja codificar um PDA manualmente. Considere usar um gerador de analisador como ANTLR ou byacc . Se, por outro lado, você deseja investigar a análise de linguagens programando analisadores, você deve continuar com outros algoritmos básicos de análise, como CYK , Earley , descida recursiva e LR .
fonte
Sugiro que você leia também a boa resposta do Jukka para a pergunta " Combinando expressões regulares usando expressões regulares " na história. Um trecho:
Este é apenas um link para uma interessante "visão diferente" (na minha opinião) sobre a linguagem da expressão regular; conforme sublinhado nos comentários abaixo, não é útil para criar uma árvore de sintaxe. Se você quiser codificar manualmente seu analisador, sugiro este artigo simples no projeto de código " Writing-own-regular-expression-parser ".
fonte