J'écris un fichier flex personnalisé pour générer un lexer à utiliser avec JSyntaxpane.Suivi de l'état dans JFlex
Le langage personnalisé dont j'ai besoin pour lex a différents états qui peuvent être intégrés les uns aux autres dans une sorte de pile. E Vous pourriez écrire une expression contenant une seule chaîne entre guillemets, puis incorporer une autre expression dans la chaîne en utilisant un jeton spécial eval(). Mais vous pouvez également intégrer l'expression dans une chaîne entre guillemets.
par exemple:
someExpressionFunction('a single-quoted string with an eval(expression) embedded in it', "a double-quoted string with an eval(expression) embedded in it")
Ceci est une simplification, il y a plus d'états que cela, mais en supposant que je dois avoir différents états pour DOUBLE_STRING et SINGLE_STRING il décrit de manière adéquate ma situation.
Quelle est la meilleure façon d'assurer mon retour à l'état correct lors de la fermeture de l'expression eval (c.-à revenir à DOUBLE_STRING si j'étais entre guillemets, SINGLE_STRING si j'étais entre guillemets simples)
La solution que j'ai trouver, qui fonctionne, est de garder une trace de l'état en utilisant une pile et certaines méthodes personnalisées à utiliser au lieu d'utiliser yybegin pour démarrer un état différent.
private Stack<Integer> stack = new Stack<Integer>();
public void yypushState(int newState) {
stack.push(yystate());
yybegin(newState);
}
public void yypopState() {
yybegin(stack.pop());
}
Est-ce la meilleure façon d'y parvenir? Y a-t-il une fonction intégrée plus simple de JFlex que je peux utiliser ou une bonne pratique que je devrais connaître?
Je suis arrivé avec la même idée, mais j'ai pensé que c'était une mauvaise pratique. Alors maintenant, il est beaucoup plus facile d'implémenter des états incorporés! – Dany