Question

Bien que cette question concerne JFLEX, elle s'applique probablement à d'autres générateurs de scanner tels que Lex, Flex également.

Si j'ai une règle, comment puis-je créer un groupe de capture dans une partie de cette règle et utiliser le résultat de ce groupe capturé comme argument au code qui est appelé à la correspondance de la règle?

Par exemple, disons que j'avais une règle simple pour correspondre à une balise SGML:

"<"[a-zA-Z]+">"    {return new Token(Type.OPEN_TAG);}

Comment pourrais-je capturer la partie de caractère interne ([a-za-z] +) et l'utiliser comme argument dans mon constructeur de jeton?

EDIT: Je suis conscient que je pourrais simplement utiliser yyText () pour obtenir la valeur entière correspondante, puis séparer les pièces ailleurs dans le code, mais cela semble que cela rendrait les choses plus compliquées qu'elles ne doivent l'être.

Était-ce utile?

La solution

Les générateurs de scanner ne prennent généralement pas en charge les groupes de capture et pour être honnête, je n'ai jamais vu un besoin valable pour eux dans un générateur de scanner. La plupart des choses pour lesquelles nous pourriez normalement nous faire des groupes de capture dans d'autres moteurs regex sont mieux gérés dans l'analyseur ou par un simple morceau de code dans l'action.

Quelque chose comme ce qui suit devrait probablement fonctionner.

"<"[a-zA-Z]+">"    {
                     String matchedText = yytext();
                     String label = matchedText.substring(1, matchedText.length() - 1);
                     return new Token(Type.OPEN_TAG, label);
                   }

La mise en œuvre de la capture de groupe a tendance à interférer avec de nombreuses optimisations effectuées par le générateur de scanner pour réduire la taille de la table de transition. Je n'ai jamais utilisé JFLEX, mais je semble me souvenir de quelque chose sur Flex soutenant une forme limitée de retour en arrière et regardez vers l'avenir / derrière, mais il émettait alors des avertissements sur les performances si elle est utilisée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top