Seite 1 von 1

RegEx: Verschachtelte Prozeduren/Funktionen rauslösen

Verfasst: 26.06.2014 14:50
von TroaX
Halli Hallo,

kleine Fräge.

Vielleicht sehe ich den Wald vor lauter Bäumen nicht. Aber da ich extrem viel mit PHP arbeite und dadurch ein wenig von der RegEx dort verwöhnt wurde, stellt sich beim Einsatz der RexEx Funktionalität in PureBasic eine Herausforderung ein.

Aber erst einmal zu meinem Vorhaben:
Ich will einen Stylesheet und HTML Abstraktions-Konverter schreiben. Dazu würde ich gerne die Runtime-Lib nutzen. Es soll im Grunde 5 Hauptaufgaben erledigen. Es soll für HTML und CSS eine einheitliche Syntax erzeugt werden. Es soll selbstständig für Trennung von Markup und Styling sorgen. Es soll den Output dieses Konverters vom Stil für Gruppen und Teams vereinheitlichen. Es soll die Fehleranfälligkeit minimieren. Und zu guter letzt soll man mit Hilfe von Templates eigene Codebausteine unter Prozeduren ansprechbar machen.

So in etwa soll es aussehen:

Code: Alles auswählen

h1("Das ist eine Überschrift","","us")
ui(li("Listeneintrag1")+li("Listeneintrag2"))
Rauskommen soll am Ende dieses:

Code: Alles auswählen

<h1 class="us">Das ist eine Übershrift</h1>
<ui>
  <li>Listeneintrag1</li>
  <li>Listeneintrag2</li>
</ui>
Mein Problem: Die Regulären Ausdrücke werfen leider keine Stringposition eines gefundenen Pattern's zurück und sind auch nicht in der Lage, wie in PHP Callback's bei erfolgreicher Suche aufzurufen. Wie löse ich jetzt am besten wie in dem obigen Beispiel die li-Prozeduren aus den Parametern der ui-Prozedur heraus, um an die selbe Stelle die Rückgabe der dahinter steckenden nativen Prozedur zu setzen? Denn das bereitet mir ehrlich gerade Kopfschmerzen. :D

Gruß Troax

Re: RegEx: Verschachtelte Strings

Verfasst: 26.06.2014 15:00
von NicTheQuick
Wieso nimmst du nicht einfach den XML-Parser?

Re: RegEx: Verschachtelte Strings

Verfasst: 26.06.2014 15:38
von TroaX
Weil es in die andere Richtung geht :D

Aus dem oberen soll das untere werden. Und das obere ist kein XML ;)

HTML könnte man als XML parsen, wenn man es entsprechend vorbereitet und nicht nach dem Motto "Quirks macht es schon" gearbeitet wurde. Aber den Prozeduren-Code mit XML parsen klappt nicht ;)

Re: RegEx: Verschachtelte Strings

Verfasst: 26.06.2014 15:43
von matbal
@TroaX

STARGÅTE hat genau aus diesem Grund eine Include geschrieben: Regex - Lizensfreies Include für reguläre Ausdrücke (Beta)

Re: RegEx: Verschachtelte Strings

Verfasst: 26.06.2014 15:53
von STARGÅTE
ui(li("Listeneintrag1")+li("Listeneintrag2"))
Damit du solche "Klammerbäume" richtig auflösen kannst (da du ja in gewisser maßen die Klammern zählen musst), brauchst du solch einen Syntax:

Code: Alles auswählen

\( ( (?: [^()]+ | \([^()]+\) )+ ) \)
Der muss dann mit einem RegReplace rekursiv geparst werden.

Re: RegEx: Verschachtelte Strings

Verfasst: 26.06.2014 16:10
von TroaX
Das kommt davon wenn man zu problemspezifisch sucht. :D

Danke matbal

Damit ist das Problem gelöst. ReplaceRegex, das über die Callback-Prozedur an die Runtime-Lib senden und dann den String zurückwerfen. Perfekt! Danke ;)

@Stargate:
Jop ich weiß. Aber zu dem Punkt komme ich noch. Aber ich denke das kann ich dank der Callbacks schon irgendwie herausfummeln ;) Aber Danke für das Pattern. Schau ich mir zu Hause mal an :)

Gruß Troax

Re: RegEx: Verschachtelte Strings

Verfasst: 26.06.2014 18:04
von STARGÅTE
Noch ein Hinweis:

Reguläre Ausdrücke sind zwar mächtig, aber gerade bei vielen "Quantifications" (also + oder *) und ODERs, viele Backreferenzen beim parsen genutzt werden müssen, die den Vorgang extrem verlangsammen.

Bei einem Bekannten und relativ einfachen Syntax wäre es effizienter und einfacher selbst CharByChar den Text zu parsen.
Eine "(" und ")" kannst du ja eindeutlich finden lassen
If *Char\c = '('
Und auch beim öffnen eines Strings durch ", auch "(" ")" überspringen.

Wenn du mein Include nutzen möchtest, dann bitte Feedback an mich geben (per PN), in bezug auf Performence, Bugs usw. Danke.

Re: RegEx: Verschachtelte Strings

Verfasst: 27.06.2014 12:42
von TroaX
Huhu. Ich nochmal ...

Ich denke ich werde mit Regulären Ausdrücken nur die Strings herauslösen, da sich diese logischerweise nicht verschachteln lassen, diese dann in eine Map übertragen und im Code durch generierte Unique-Token's ersetzen. Daduch kann ich schon einmal vor Kollissionen mit den Klammern in Strings vorbeugen. Danach werde ich wohl Zeichenweise nach den Klammern suchen und mitzählen. Die Token's kann ich ja zum Glück jederzeit über die Runtime-Aufrufe durch die Strings wieder ersetzen. Denn mit Regulären Ausdrücken die Verschachtellungen zu bearbeiten, da denke ich würde die Performance doch etwas zu krass leiden.

@Stargate: Ich werde dir natürlich gerne eine Rückmeldung über Performance und Bugs bei den Ausdrücken geben, wenn ich soweit bin ;)

PS: Hatte überlegt, die Syntax vielleicht an JSON anzulehnen. Allerdings sind dort die Art von Verschachtellungen nicht möglich, die man für soetwas benötigt. Daher kann ich auch nicht den Weg über die JSON-Lib nehmen. Selbst dafür ist sie nicht zu gebrauchen xD Ich habe das Gefühl die Runtime-Lib ist sinnvoller als JSON :D

EDIT: Habe mal Thread-Titel angepasst :D