[PHP] Pattern

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Voor een scriptje wil ik het volgende voor elkaar boxen. Wie kan mij in de goede richting duwen?

Er is een string die er als volgt uit kan zien: ((a=b)||(c=d))&&(e=f).

Door het gebruik van de haakjes zijn er dingen bij elkaar gegroepeerd. Wat er dus eigenlijk staat is (a=b OF c=d) EN (e=f).

Hoe ga ik in PHP met een (preg_)split voor elkaar krijgen dat er van de buitenste haakjes naar binnen gewerkt wordt. Eerst leest het dat er iets staat als () && (). Daarna gaat de eerste () de functie recursive in, die ziet op z'n beurt weer dat er staat () || (). Waarbij de eerste () weer de functie recursive in gaat en die ziet op zijn beurt weer dat er staat a = b.

Nu wil ik dit geheel in een array zien te krijgen, netjes van buiten naar binnen gewerkt. Zelf had ik een array als deze in gedachte:
[0] = array(
[0] = a=b
[1] = ||
[2] = c=d
)
[1] = &&
[2] = e=f


Waar ik, denk ik, naar op zoek ben is een pattern die op de buitenste haakjes kan splitten, ongeacht hoeveel het er zijn. Dan kan ik per inhoud van die haakjes de functie weer recursive aanroepen, net zo lang tot ik bij de laatste ben en er dus echt staat a=b.

[ Voor 13% gewijzigd door Verwijderd op 30-09-2009 21:57 ]


  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 16-09 19:01

Tux

Deze taal is niet bepaald regulier aangezien er recursie in zit en je, om de juiste haakjes aan elkaar te matchen extra geheugen nodig hebt. Deze taal is dus niet te accepteren met een reguliere expressie.

De taal is wel context-vrij. Eigenlijk zou je door de string moeten lopen en terwijl je dat doet een tree op moeten bouwen met de structuur. Deze kan je dan met een recursieve functie evalueren.

[edit]

Doet die recursieve functie die jij aanroept nog iets anders dan twee dingen met elkaar vergelijken. Anders zou een makkelijke oplossing zijn om met een replace vergelijkingen van de vorm (a=b) te vervangen met true of false. Daarna kan je dan replaces doen op '(true&&true)', '(false||true)' etc naar de uitkomst (resp. true en true). Als je dit herhaalt dan blijft er uiteindelijk true of false over.

Mocht je echt iets nuttigs in de recursie willen doen moet je de string parsen en een boomstructuur opbouwen.

[ Voor 39% gewijzigd door Tux op 30-09-2009 22:13 ]

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Verwijderd

Topicstarter
Een boomstructuur opbouwen lijkt me, voor zover ik nu doorzie, de beste oplossing.

Dit was een simpel voorbeeld. Ben bezig om met een class om het aansturen van SQL te vergemakkelijken. Het kan dus zijn dat a=b voorkomt, maar ook a>b, etc. De uitkomsten zijn geen true of false. Maar er wordt dus uiteindelijk een gehele query opgebouwd.

Dit low-level gedeelte heb ik al werkend, a=b wordt dus vervangen door a = 'b'. Heb verder nog meer van dat soort regeltjes bedacht. Zo is a><{1,3} een verkorte versie voor a BETWEEN '1' AND '3'. Hierdoor zal er dus geen true of false uitkomen helaas.

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 16-09 19:01

Tux

Dan is het misschien het handigste om je eens te verdiepen in context-vrije grammatica's en pushdown automaten. Als je dat onder de knie hebt is het makkelijk om over dit soort dingen na te denken.

Verder zou je dit denk ik wel moeten kunnen doen met een LL(1) parser bijvoorbeeld.

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Tux schreef op woensdag 30 september 2009 @ 22:07:
Deze taal is niet bepaald regulier aangezien er recursie in zit en je, om de juiste haakjes aan elkaar te matchen extra geheugen nodig hebt. Deze taal is dus niet te accepteren met een reguliere expressie.
Maar met pcre wel degelijk (met (?R)). Maar waarschijnlijk wil je toch een echte parser hebben, dan kun je bijvoorbeeld makkelijker zinnige foutmeldingen geven.

Eigenlijk vraag ik me trouwens af of de nieuwe taal SQL wel echt vergemakkelijkt, en of je niet beter helemaal kan afzien van dit project. ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Verwijderd

Topicstarter
pedorus schreef op woensdag 30 september 2009 @ 22:34:
[...]

Eigenlijk vraag ik me trouwens af of de nieuwe taal SQL wel echt vergemakkelijkt, en of je niet beter helemaal kan afzien van dit project. ;)
Het is niet alleen het opbouwen van queries, maar ook het makkelijker opslaan van records, etc, etc.

Dit gaat nu wel erg diep inderdaad, maar was benieuwd hoe dit aan te pakken. Want iets als () && () is toch wel verrek te handig. Heb ook niet zo'n zin meer om telkens SQL queries te gaan bouwen / typen, beter 1x goed uitwerken en dan foutloos kunnen gebruiken. Vandaar deze generieke class die ook rekening houdt met de tabel structuur etc. Een soort wrapper om een record (die de tabel structuur kent) zeg maar. $class->find("kleur=rood") levert mij alle records waarvan de kleur rood is op in object met daarin de functies om deze records zelfstandig te kunnen opslaan / verwijderen / etc.

Het is nu dus even de afweging of het zin heeft om in LL te gaan verdiepen of het toch wat meer basic te houden.

Programmeren, slijpsteen voor de geest! ;)

[ Voor 8% gewijzigd door Verwijderd op 30-09-2009 22:43 ]


Acties:
  • 0 Henk 'm!

  • sickyb
  • Registratie: Juli 2009
  • Laatst online: 12-09 22:18
Wat tux zegt een LL1 parser bouwen.
Dan moet je dus eerst na gaan denken over de grammatica van je versimpelde query language
Ik neem aan dat je bekend bent met grammatica's.
anders is op www.cs.rug.nl/~jjan/vb/practicum wel een voorbeeld van de syntax voor een simpele rekenmachine te vinden.

maar goed. op tweakers wordt je toch wel geacht zelf het internet te kunnen afstruinen naar goede voorbeelden.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Jullie denken allemaal te ingewikkeld. Het makkelijkste is om de expressie gewoon om te zetten naar reverse polish notation. Dan zijn al je haakjes weg, en kun je de expressie heel gemakkelijk evalueren door van links naar rechts door de token stream heen te lopen en een stack bij te houden waar je variabelen op staan en waar je je bewerkingen op doet. Er een boom van objecten van maken kan op exact dezelfde manier, alleen dan heb je een stack van expressie objecten ipv een stack van waarden.

Het omzetten van een infix expressie naar RPN kan heel simpel met een standaard algoritme genaamd shunting yard, van ons eigen Edsger Dijkstra :)

Overigens ben ik het wel eens met pedorus over of dit eigenlijk überhaupt wel is wat je wilt. Tenzij je iets van user-defined filters wilt kunnen ondersteunen oid.

[ Voor 27% gewijzigd door .oisyn op 02-10-2009 23:39 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Tnx voor de input.
.oisyn schreef op vrijdag 02 oktober 2009 @ 23:25:
Overigens ben ik het wel eens met pedorus over of dit eigenlijk überhaupt wel is wat je wilt. Tenzij je iets van user-defined filters wilt kunnen ondersteunen oid.
Wat ik wil is een SQL schil om een tabel / record heen om het geheel van werken makkelijker te maken. Denk hierbij aan functies om gewijzigde gegevens op te slaan, te verwijderen of nieuwe records aan te maken. Deze functies bouwen allemaal hun SQL queries op zodat ik dat niet meer hoef te doen.

Een class extenden hiermee en het scheelt een hoop werk, want je hebt alle acties voor een tabel / record al tot je beschikking. Kleine tool dus. Bij de zoek functie bedacht ik me, als ik nou een "simpele" parser kan bouwen gaat dit nog meer werk schelen. Als "(naam=appel)&&(pass=peer)" omgezet kan worden naar een query hoef ik, wederom, mezelf niet bezig te houden met quotes, juiste opbouw query, etc. Nou lukt dit gedeeltelijk, standaard SQL, maar toen kwam ik bij de haakjes aan. En dan wordt het geheel toch wat moeilijker.

Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-08 20:35
Verwijderd schreef op zondag 04 oktober 2009 @ 16:43:
Tnx voor de input.


[...]

Wat ik wil is een SQL schil om een tabel / record heen om het geheel van werken makkelijker te maken. Denk hierbij aan functies om gewijzigde gegevens op te slaan, te verwijderen of nieuwe records aan te maken. Deze functies bouwen allemaal hun SQL queries op zodat ik dat niet meer hoef te doen.
Je weet dat er al legio oplossingen daarvoor beschikbaar zijn in PHP? Bijvoorbeeld Doctrine en Propel. Beide zijn gebaseerd op het object relational mapping principe.

Wellicht dat je daar iets aan hebt? Of in ieder geval in de source code kan kijken (het is open source) om te kijken hoe zij sommige dingen aanpakken...

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Verwijderd schreef op zondag 04 oktober 2009 @ 16:43:
Wat ik wil is een SQL schil om een tabel / record heen om het geheel van werken makkelijker te maken. Denk hierbij aan functies om gewijzigde gegevens op te slaan, te verwijderen of nieuwe records aan te maken. Deze functies bouwen allemaal hun SQL queries op zodat ik dat niet meer hoef te doen.
Het lijkt me dat je dan een ORM/DAO framework aan het implementeren bent. Is er niet eentje die je van de plank kan pakken?
Als "(naam=appel)&&(pass=peer)" omgezet kan worden naar een query hoef ik, wederom, mezelf niet bezig te houden met quotes, juiste opbouw query, etc. Nou lukt dit gedeeltelijk, standaard SQL, maar toen kwam ik bij de haakjes aan. En dan wordt het geheel toch wat moeilijker.
Er is natuurlijk een reden dat SQL is zoals het is en niet een andere syntax heeft. Als je een systeem bouwt dat dezelfde mogelijkheden als SQL moet hebben, dan krijgt het dezelfde complexiteit en loop je tegen dezelfde problemen op.

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@Borizz: tnx, ik ga deze eens bekijken.
Confusion schreef op zondag 04 oktober 2009 @ 16:52:
Het lijkt me dat je dan een ORM/DAO framework aan het implementeren bent. Is er niet eentje die je van de plank kan pakken?
Is een optie, maar die laat ik nog even links liggen. Wil eerst zelf wat proberen + te leren.

Als ik alles van de plank ga pakken zit ik straks in Frontpage te werken.. :P
Er is natuurlijk een reden dat SQL is zoals het is en niet een andere syntax heeft. Als je een systeem bouwt dat dezelfde mogelijkheden als SQL moet hebben, dan krijgt het dezelfde complexiteit en loop je tegen dezelfde problemen op.
Het gaat mij niet om een taal die op SQL lijkt, maar een manier waardoor ik met een kortere notatie dezelfde query krijg zonder deze telkens zelf op te moeten bouwen.

[edit]

Daarbij had ik geen weet van RPN, nu wel. Kan nog eens handig zijn.

[ Voor 4% gewijzigd door Verwijderd op 04-10-2009 20:20 ]

Pagina: 1