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.

  1. 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.

  2. Qualquer caso de uso específico em que JFlex seja útil em vez de regex.

  3. De qualquer forma, é útil para análise geral, digamos, de arquivos de texto/xml?

Desde já, obrigado.

Foi útil?

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:

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top