2009-05-20 14 views
2

Ich schreibe eine benutzerdefinierte Flex-Datei, um einen Lexer für die Verwendung mit JSyntaxpanel zu generieren.Überblick über den Status in JFlex

Die benutzerdefinierte Sprache, die ich lex haben muss, hat verschiedene Zustände, die in einer Art Stapel ineinander eingebettet werden können.

I.E Sie könnten einen Ausdruck schreiben, der eine einzige in Anführungszeichen gesetzte Zeichenfolge enthält, und dann einen anderen Ausdruck in die Zeichenfolge einbetten, indem Sie ein spezielles Token eval() verwenden. Sie können den Ausdruck jedoch auch in eine Zeichenfolge mit doppelten Anführungszeichen einbetten.

zB:

someExpressionFunction('a single-quoted string with an eval(expression) embedded in it', "a double-quoted string with an eval(expression) embedded in it") 

Dies ist eine Vereinfachung ist, gibt es mehr Staaten als diese, aber unter der Annahme, ich verschiedene Zustände für DOUBLE_STRING haben müssen und SINGLE_STRING es angemessen beschreibt meine Situation.

Was ist der beste Weg, ich beim Schließen des eval Ausdruck Rückkehr in den richtigen Zustand zu gewährleisten (dh zu DOUBLE_STRING zurück, wenn ich in doppelte Anführungszeichen war, SINGLE_STRING wenn ich in Apostrophe war)

Die Lösung, die ich habe kommen, was funktioniert, ist es, den Status zu verfolgen mit einem Stack und einige benutzerdefinierte Methoden zu verwenden anstelle von yybegin, um einen anderen Zustand zu starten.

private Stack<Integer> stack = new Stack<Integer>(); 

public void yypushState(int newState) { 
    stack.push(yystate()); 
    yybegin(newState); 
} 

public void yypopState() { 
    yybegin(stack.pop()); 
} 

Ist dies der beste Weg, dies zu erreichen? Gibt es eine einfachere integrierte Funktion von JFlex, die ich nutzen kann, oder eine Best Practice, die ich kennen sollte?

+0

Kam mit der gleichen Idee, aber ich dachte, es ist eine schlechte Praxis. Jetzt ist es viel einfacher, eingebettete Zustände zu implementieren! – Dany

Antwort

3

Ich denke, das ist ein sehr guter Weg, es zu tun. Ich brauchte tatsächlich ein ähnliches Feature, um Groovy GString, Python wie String und etwas HTML zu JavaDocs hinzuzufügen.

Was ich auch hinzufügen möchte, ist ein Lexer, der einen Lexer aufruft, um Unterabschnitte zu analysieren. Etwas wie JavaScript in HTML eingebettet. Aber ich konnte nicht die Zeit dafür bekommen.

Ich mag StackOverflow, aber frage mich nur, warum hast du das nicht auf JSyntaxPanes Ausgaben gepostet?

+0

Hi Ayman, tut mir leid, ich habe gerade deine Antwort gesehen. Ich mag auch StackOverflow, also denke ich, ich wollte nur sehen, ob es hier viel von flex/lexing/parsing Community gibt. Ich denke, ich sollte Cross bei jsyntaxpane gebucht haben. Ich habe dort in der Vergangenheit gepostet (ich bin TomPoges dort). Gute Arbeit an JSyntaxPane btw. –