2009-05-20 4 views
2

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?

+0

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

Répondre

3

Je pense que c'est une très bonne façon de le faire. J'avais besoin d'une fonctionnalité similaire pour ajouter Groovy GString, Python like String et du HTML à JavaDocs.

Je voudrais également ajouter un Lexer appelant un Lexer pour analyser les sous-sections. Quelque chose comme JavaScript incorporé dans HTML. Mais je n'ai pas eu le temps de le faire. J'aime StackOverflow, mais je me demandais pourquoi vous n'avez pas posté cela sur les problèmes de JSyntaxPane?

+0

Salut Ayman, désolé je viens juste de voir ta réponse. J'aime aussi StackOverflow, donc je suppose que je demandais juste de voir s'il y avait beaucoup de communauté flex/lexing/parsing ici. Je suppose que je devrais avoir cross posté à jsyntaxpane. J'ai posté là dans le passé (je suis TomPoges là-bas). Beau travail sur JSyntaxPane btw. –