Pergunta
Eu sou novo no JFlex.Concluí que JFlex é um gerador de analisador.No entanto, ainda não estou claro sobre o seguinte e preciso de esclarecimentos sobre o mesmo.
Quão diferente é usar regex para identificação de padrões e segregação de dados e quais são os benefícios adicionais de usar JFlex.
Qualquer caso de uso específico em que JFlex seja útil em vez de regex.
De qualquer forma, é útil para análise geral, digamos, de arquivos de texto/xml?
Desde já, obrigado.
Solução
Jflex não é um gerador de analisador, mas um gerador de scanner.Isto tokeniza a entrada.Use-o em combinação com um gerador de analisador como XÍCARA ou BYACC/J.
Há uma diferença importante entre scanner e analisador:
- Um scanner pode reconhecer um Linguagem normal, enquanto
- Um analisador pode reconhecer um Linguagem Livre de Contexto.
Suas perguntas:
1) e 2) Suponha que você precise converter um fluxo de entrada de caracteres em um fluxo de tokens, dados os seguintes padrões:
- se a entrada corresponder
[0-9]+
(algo diferente de\.
segue) então é uma integral sem sinal.Enviar"INTEGER"
para a saída. - se a entrada corresponder
[0.9]+\.[0-9]*
então é um ponto flutuante não assinado.Enviar"FLOAT"
para a saída.
Observe que eles compartilham um prefixo comum.Se quiser verificar a entrada com expressões regulares, você terá que dividi-las em seu prefixo comum (a menos que queira que seja muito lento, pois as expressões regulares são caras).Em tempo de execução, você terá que primeiro avaliar o prefixo, se corresponder, e depois avaliar o que se segue, se ^\.
, você tem uma integral e começará tudo de novo, se \.
você terá que avaliar se o texto a seguir é a mantissa de um número de ponto flutuante.Se sim, você tem um FLOAT
.
Basicamente o que você precisa construir é um autômato de estado finito em que os estados são pontos de decisão e refletem a entrada vista até agora, e as transições são avaliações sobre o caráter atual visto na entrada.
JFlex (como muitos outros geradores de scanner) permitirá gerar o código para tais autômatos automaticamente, fornecendo apenas regexes (basicamente).E irá gerar um código muito eficiente para isso.
3) Você pode usar um scanner gerado e um analisador gerado em conjunto para reconhecer qualquer linguagem livre de contexto.Como linguagens de programação.Embora seja possível analisar XML com ele (nunca tentei), analisadores de propósito específico são geralmente usados para XML (como SAXOFONE, StAX, etc, etc) já que o XML tem uma estrutura bem conhecida e então não há necessidade de gerar um analisador.
A propósito, tenha em mente que você não pode analisar XML com Regex. ;)
Cumprimentos.