2010-10-10 2 views
3

Bien que cette question porte sur JFlex, elle s'applique probablement à d'autres générateurs de scanner tels que Lex, Flex. 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 du code qui est appelé lors de la correspondance de la règle?Comment utiliser les groupes de capture d'expressions régulières avec JFlex?

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 intérieur ([a-zA-Z] +) et de l'utiliser comme argument dans mon constructeur Token? Editer: Je suis conscient que je pourrais simplement utiliser yytext() pour obtenir toute la valeur correspondante et ensuite séparer les parties ailleurs dans le code, mais cela semble rendre les choses plus compliquées qu'elles ne devraient l'être.

Répondre

1

Les générateurs de scanner ne supportent généralement pas les groupes de capture, et pour être honnête, je n'ai jamais vu un besoin valide pour eux dans un générateur de scanner. La plupart des choses pour lesquelles les groupes de capture d'autres moteurs RegEx sont normalement utilisés sont mieux traitées 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); 
        } 

capture de groupe mise en œuvre a tendance à interférer avec la plupart des optimisations effectuées par le générateur de balayage pour réduire la taille de la table de transition. Je n'ai jamais utilisé JFlex, mais j'ai l'impression de me souvenir de quelque chose à propos du flex supportant une forme limitée de backtracking et de regarder en avant/en arrière, mais qui émettrait des avertissements sur la performance si utilisé.

Questions connexes