PHP + Regex für Codeersetzung: Farben aus Stringliteralen killen
-
Hey,
ich schreibe gerade ein [cpp][/cpp]-Tag.
Ich poste Mal kurz den Code, um mich drauf verweisen zu können:
Da der Code sehr viele Tags enthält, scheint das Forum damit nicht klar zu kommen, ich habe ihn daher hochgeladen: http://nopaste.info/097cc0874b.htmlDer Plan ist halt, für jedes TAG die entsprechenden Farben zu ersetzen. Das mache ich, indem ich halt mein [color]-Tag drum setze, das irgendwann später ausgewertet wird.
Zunächst werte ich einzelne chars aus, dann Zeichenketten, dann ersetze ich Schlüsselwörter. Danach möchte ich in Literalen alle bisherigen Farben löschen (falls z.B. Schlüsselwörter in Kommentaren vorkommen). Und genau da liegt jetzt das Problem, denn Folgendes:
std::cout << "Hi" << "int h = 5";
wird ohne die besagte Regexzeile erstmal zu:
std::cout << [.color='#cc7755']"Hi"[./color] << [.color='#cc7755']"[.color='#0000aa']int[./color] h = 5"[./color];
und mit dann zu:
std::cout << [.color='#cc7755']x"Hi"[./color] << y"[.color='#0000aa']intz h = 5"w[./color];
Erklärung ist klar: Er will unbedingt den "REMOVE EXISTING COLORS IN LITERALS"-Code ausführen. Dafür nimmt er das erste ", speist das zweite und dritte " in den . ein und nutzt das letzte " als Endzeichen meines Regex. Und als color nimmt er dabei das äußere color und als /color das innere...
Lösungsidee ist einfach, dass ich zwischen color und /color alles zulasse, nur eben nicht "
tl;dr: Eigentliche Frage also:
Weiß jemand, wie ich sagen kann, dass ich alle Zeichen erlaube, aber nicht "?Falls jemand einen besseren Vorschlag für die Umsetzung meines Codetags hat, bin ich dafür auch offen.
Viele Grüße
Edit: .color und ./color geschrieben, weil code-tag sonst nicht klappt.:(
-
Hi,
okay, ich habe nach Probieren zig Möglichkeiten nun endlich eine funktionierende und imo schönere Variante gefunden:
http://nopaste.info/6b3216add6.htmlEinfach lustig ersetzen, wie man möchte und wenn irgendwas alte Farben überschreiben soll, sollen die Farben halt direkt beim Übersetzen aufgefressen werden. Ist eigentlich schlicht, hat aber lang genug gedauert, drauf zu kommen.
-
delete[]
hast du zweimal in der Keywords-Liste. Ansonsten ist die Liste ziemlich unvollständig. Kopier sie doch einfach aus dem Standard. Oder war das nur zum Testen?
-
Gibts irgendeinen bestimmten Grund, warum Du nicht einfach pygments oä. verwendest?
-
Es erschien mir einfach zu implementieren und ich kannte pygments nicht. Plus, ich bin ein Lizenz-n00b und hab immer Angst, wenn es darum geht, was Fremdes einzusetzen.
-
Einen guten BB-Parser musst du stack-based machen, da Tags verschachtelt werden können.