2010-07-14 6 views
1

Je suis nouveau à JFlex. J'ai compris que JFlex est un générateur d'analyseur. Cependant, je ne suis toujours pas clair sur ce qui suit et j'ai besoin de clarification autour de la même chose.en utilisant JFlex au lieu de Regex

  1. Quelle différence d'utiliser regex pour la séparation d'identification et les données modèle et quels sont les avantages supplémentaires de l'utilisation JFlex.

  2. Cas d'utilisation spécifique où JFlex est utile par rapport à la regex. Est-il utile pour l'analyse générale, par exemple de fichiers texte/xml?

Merci d'avance.

Répondre

8

JFlex n'est pas un générateur d'analyseur, mais un générateur de scanner. Il tokenizes l'entrée. Utilisez-le en combinaison avec un générateur d'analyseur comme CUP ou BYACC/J.

Il y a une différence importante entre le scanner et l'analyseur:

Vos questions:

1) et 2) Supposons que vous devez convertir un flux d'entrée de caractères dans un flux de jetons, étant donné les motifs suivants:

  • si l'entrée correspond à [0-9]+ (quelque chose de différent que \. suit) alors c'est une intégrale non signée. Envoyer "INTEGER" à la sortie.
  • si l'entrée correspond à [0.9]+\.[0-9]* alors il s'agit d'un point flottant non signé. Envoyer à la sortie.

Notez qu'ils partagent un préfixe commun. Si vous voulez analyser l'entrée avec des expressions régulières, vous devrez les diviser en leur préfixe commun (à moins que vous ne vouliez que ce soit très lent puisque les expressions régulières sont chères). Au moment de l'exécution, vous devrez d'abord évaluer le préfixe, si les correspondances, puis évaluer ce qui suit, si ^\., vous avez une intégrale et recommencera, si \. vous devrez évaluer si le texte suivant est la mantisse d'un nombre à virgule flottante. Si oui, vous avez un FLOAT.

Fondamentalement ce que vous devez construire est un finite state automaton dans lequel les états sont des points de décision et reflètent l'entrée vue jusqu'ici, et les transitions sont des évaluations sur le caractère courant vu dans l'entrée. JFlex (comme beaucoup d'autres générateurs de scanner) vous permettra de générer automatiquement le code pour ces automates, en fournissant seulement des regex (fondamentalement). Et va générer du code très efficace pour cela.

3) Vous pouvez utiliser un scanner généré et un analyseur généré en tandem pour reconnaître les langages sans contexte. Tels que les langages de programmation.Bien qu'il devrait être possible d'analyser XML avec (je n'ai jamais essayé), les analyseurs spécifiques sont généralement utilisés pour XML (tels que SAX, StAX, etc, etc) depuis XML a une structure bien connue et pas besoin à générer un analyseur.

BTW, s'il vous plaît gardez à l'esprit que you cannot parse XML with Regex. ;)

Cordialement.

+0

merci mrrtnn, très bien expliqué. – Nrj

Questions connexes