RegEx: Verschachtelte Prozeduren/Funktionen rauslösen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
TroaX
Beiträge: 720
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

RegEx: Verschachtelte Prozeduren/Funktionen rauslösen

Beitrag 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
Zuletzt geändert von TroaX am 27.06.2014 12:52, insgesamt 1-mal geändert.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, Gambas
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: RegEx: Verschachtelte Strings

Beitrag von NicTheQuick »

Wieso nimmst du nicht einfach den XML-Parser?
Benutzeravatar
TroaX
Beiträge: 720
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: RegEx: Verschachtelte Strings

Beitrag 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 ;)
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, Gambas
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: RegEx: Verschachtelte Strings

Beitrag von matbal »

@TroaX

STARGÅTE hat genau aus diesem Grund eine Include geschrieben: Regex - Lizensfreies Include für reguläre Ausdrücke (Beta)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: RegEx: Verschachtelte Strings

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
TroaX
Beiträge: 720
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: RegEx: Verschachtelte Strings

Beitrag 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
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, Gambas
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: RegEx: Verschachtelte Strings

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
TroaX
Beiträge: 720
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: RegEx: Verschachtelte Strings

Beitrag 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
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, Gambas
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Antworten