Irgendwie habe ich gerade ein Problem mit regulären Ausdrücken im Allgemeinen. Aber erstmal die grundsätzliche Situation. Wer faul ist ignoriert das und springt zur Frage
Situation:
Ich schreibe (bzw werde das tun) einen einfachen Compiler für einen Assembler Dialekt. Ist im wesentlichen nur eine "Textersetzung" von Schlüsselwörtern und dann eine Umwandlung von deren numerischen Parametern ins binäre. Das soll dann z.B. so aussehen:
|
Quellcode
|
1
|
out ENGINE:0:0 255
|
Zu dem Code: ENGINE:1:0 ist quasi ein define, das vom Compiler ersetzt werden soll durch den ersten Motor und dessen Port 0. Alternativ könnte man die Portnummer auch hardcoden. Allgemein wird hier halt ein Port mit einem Wert belegt.
Nun wollte ich, um das Problem "richtig" anzugehen garnicht erst anfangen einzelne "relevante" Zeichenketten von Hand rauszusuchen, sondern mich auf reguläre Ausdrücke stützen. "Problem" an der Sache ist folgendes:
Der ASM Code ist (möglicherweise, nicht zwingend) inline in XML deklariert. Also in etwa folgendermaßen:
|
Quellcode
|
1
2
3
4
5
|
<SomeNode>
<CodeNode>
out ENGINE:1:0 255
</CodeNide>
</SomeNode>
|
Das führt dazu, dass der Code teilweise richtig merkwürdig fomatiert ist. Je nachdem wie die XML Datei halt erstellt wurde und eingelesen wird, werden whitespaces mal so und mal so erzeugt / behandelt.
"Super, dass du auf Reguläre Ausdrücke setzen willst" dachte ich mir. "Filterst du halt alle Tabs, Spaces etc. irgendwie sinnig von Hand raus und ersetzt sie durch garnix." Und hab dann angefangen mich dumm und dämlich zu suchen. Mittels regulären Ausdrücken einzelne Zeichenketten rauszufiltern (wie ENGINE:1:0) ist ja nicht das Problem. Aber ich versteh den ganzen Mechanismus der Textersetzungen bei regulären Ausdrücken nicht.
Die eigentliche Frage:
Könnte mich also jemand mit einer guten Seite rund um Reguläre Ausdrücke und Ersetzungen mit solchen versorgen? Ich hab gegoogled und bin auf tausende Blogeinträge etc gestoßen, aber nicht auf sowas wie ein umfassendes Tutorial.
Und falls jemand alles gelesen haben sollte: Ist mein Ansatz irgendwie großer Müll? Hab ich ein "einfaches" Hilfsmittel (bevorzugt C++) übersehen, dass mein Problemstellung eleganter / schneller / besser löst als Reguläre Ausdrücke?
Wenn es von belang sein sollte: Ich werd mich vermutlich auf Boost.Regex stützen. Man könnte einen derart "simplen" Compiler zwar auch als Script realisieren und wäre dann vermutlich sogar schneller fertig, aber dann müsste auf dem kompilierenden PC halt Python, Ruby, PHP / whatever verfügbar sein. Daher "pures" C++.