Ich würde gerne in der Lage sein, die Menge aller Zeichen zu berechnen, die als ersten Zeichen in einer Zeichenfolge durch eine gegebene Instanz java.util.regex.Pattern
übereinstimmen können. Formal ausgedrückt, möchte ich angesichts der DFA, die einem bestimmten regulären Ausdruck entspricht, die Menge aller ausgehenden Übergänge vom Startzustand erhalten.Kann ich die Menge der ersten durch das Regex-Muster angepassten Zeichen bestimmen?
Ein Beispiel:
Pattern p = Pattern.compile("[abc]def|daniel|chris|\\s+");
Set<Character> first = getFirstSet(p);
Das Set first
folgende Elemente enthalten:
{ 'a', 'b', 'c', 'd', ' ', '\n', '\r', '\t' }
Irgendwelche Ideen? Ich bin mir bewusst, dass ich das DFA selbst konstruieren und die relevanten Zustände auf diese Weise bestimmen kann, aber ich möchte diese Art von Ärger vermeiden (lies: es ist mir nicht so viel wert). Beachten Sie, dass meine Sprache Scala ist, also habe ich Zugriff auf alle Scala-Bibliotheken (was es wert ist).
Ja, ich habe darüber nachgedacht. Dies wäre praktisch dasselbe wie das Erstellen des Front-Ends des DFA selbst.Vielleicht werde ich das tun, wenn es darauf ankommt, aber ich würde lieber eine einfachere Lösung finden. –
Ich bin nicht sicher, wie viel einfacher es wird, als es zu analysieren (nach einer festen Grammatik aus dem Sprachstandard) und einige ziemlich offensichtliche Rekursionen, aber vielleicht ist das nur meine Compiler-Konstruktion infundiert Gehirn – Tetha
Nun, Parsing und dann rekursive Traversal aren Schade, ich bin einfach nicht glücklich darüber, Java's Regular Expression Semantics replizieren zu müssen, nur um ein FIRST-Set zu bekommen. –