- Offizieller Beitrag
Ich möchte mal etwas Brainstorming mit euch betreiben.
Ziel: Ausbalanzierte Stringsequenzen in (auch geschachtelten) Strings erkennen.
Mir geht es darum, in Programmzeilen, die aus der au3 Datei gelesen werden, die Stringbereiche eindeutig zuordnen zu können.
Im Editor selbst ist die Zuordnung recht unproblematisch, da dort jeder Position auch der Style zugeordnet ist (editor.StyleAt[pos]).
Wenn ich z.B. folgende fiktive Programmzeile habe:
_SomeFunc($param1, '"', ';', "'", $param5, "text, text, text", '"') ; Kommentar, hat auch "string"
Hier zeigen sich auch schon Probleme:
- , kann nicht als Parametertrenner gelesen werden, da evtl. auch Bestandteil von Parametern oder Kommentar
- " kann selbst ein Parameter sein, aber auch Stringbegrenzer (oder auch zum Maskieren von sich selbst im String)
- Stringbegrenzer als ' oder " erleichtern es auch nicht unbedingt und das Bsp. kann man natürlich noch unberechenbarer gestalten.
Wahrscheinlich bleibt hier nur die Lösung, wie sie vermutlich auch vom Interpreter durchgeführt wird: Regex mit Subpattern-Definitionen, sieht z.B. so aus:
(?x) # ignore pattern whitespace
(?(DEFINE)
(?<string> ".*?" )
(?<number> \d+ )
(?<value>
\s* (?:
(?&string)
| (?&number)
| (?&list)
) \s*
)
(?<list> \[ (?&value) (?: , (?&value) )* \] )
)
^(?&value)$
Alles anzeigen
Wobei ich (obwohl ich Regex mag) hier mit der PCRE-Syntax etwas fremdele. Ich habe vor längerer Zeit mal mit Oniguruma gearbeitet, ist zwar ähnlich (alle Regex Dialekte ähneln sich irgendwo) - aber lag mir mehr. Naja, das ist aber nur Gewohnheitssache.
Im obigen Bsp. habe ich einen Funktionsaufruf, dadurch lässt sich der Kommentar sauber abtrennen. Habe ich aber Variablenzuweisungen mit Text (der ; enthält) wird es schon wieder unangenehmer und die ausbalanzierte Erkennung des Strings ist zwingend notwendig.
Also Lösungsvariante #1 ist, dass ich mir das Eierlegende-Wollmilchsau-Regex-Pattern bastele.
Wenn ihr ein paar Gedanken beibringen möchtet, bin ich sicher nicht böse.