Question

J'écris un fichier sur mesure flex pour générer un lexer pour une utilisation avec JSyntaxpane.

La langue personnalisée que je dois LEX différents états qui peuvent être intégrés dans l'autre dans une sorte de pile.

i.e. vous pourriez écrire une expression qui a une chaîne entre guillemets unique et puis incorporer une autre expression au sein de la chaîne en utilisant un jeton spécial eval (). Mais vous pouvez également intégrer l'expression dans un double 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 (i.e. revenir à DOUBLE_STRING si j'étais entre guillemets, SINGLE_STRING si j'étais entre guillemets simples)

La solution que je suis venu avec, ce qui fonctionne, est de garder une trace de l'état à l'aide d'une pile et des méthodes personnalisées à utiliser au lieu d'utiliser yybegin pour commencer 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 at-il une simple fonction intégrée de JFlex je peux tirer parti ou une meilleure pratique que je devrais savoir?

Était-ce utile?

La solution

Je pense que c'est une très bonne façon de le faire. En fait, je avais besoin de fonctionnalité similaire pour ajouter Groovy GString, Python comme String et code HTML à JavaDocs.

Ce que je voudrais aussi ajouter un Lexer appeler un Lexer pour analyser les sous-sections. Quelque chose comme JavaScript intégré dans HTML. Mais je ne pouvais pas le temps de le faire.

J'aime StackOverflow, mais demande pourquoi ne pas vous postez ce sur les questions de JSyntaxPane?

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