Syntax Parser für Logische Ausdrücke in PHP
ganymede
- php
Hi,
ich möchte (mit PHP5) Ausdrücke der folgenden Form in entsprechende SQL-Anweisungen übersetzen:
_and_(value1,_not_(value2,value3))
Zu:
column LIKE '%value1%' AND NOT (column LIKE '%value2%' OR column LIKE '%value3%')
Ich habe bei PEAR schon PHP_LexerGenerator und PHP_ParserGenerator entdeckt. Ich hoffe aber auf eine etwas einfachere Lösung, da die Syntax, die ich verwenden will absolut schlicht ist:
_and_(expr1, expr2, expr3, ...)
_or_(expr1, expr2, expr3, ...)
_not_(expr1)
Expressions können wiederum _and_, _or_ und _not_ oder aber Variablennamen sein (im Beispiel oben 'value1' etc.)
Jemand eine Idee, wie ich eine schlanke Minimallösung hinbekomme?
Herzlichen Dank!
Ganymede
你好 ganymede,
ich möchte (mit PHP5) Ausdrücke der folgenden Form in entsprechende SQL-Anweisungen übersetzen:
_and_(value1,_not_(value2,value3))
Zu:
column LIKE '%value1%' AND NOT (column LIKE '%value2%' OR column LIKE '%value3%')
Nach deiner Definition müsste es eher so aussehen:
_and_(value1,_not_(_or_(value2,value3)))
Ich habe bei PEAR schon PHP_LexerGenerator und PHP_ParserGenerator entdeckt. Ich hoffe aber auf eine etwas einfachere Lösung, da die Syntax, die ich verwenden will absolut schlicht ist:
_and_(expr1, expr2, expr3, ...)
_or_(expr1, expr2, expr3, ...)
_not_(expr1)Expressions können wiederum _and_, _or_ und _not_ oder aber Variablennamen sein (im Beispiel oben 'value1' etc.)
Naja, durch die Syntax liegt der Code ja schon in (serialisierter) Baum-Form vor. Da musst du ja nur noch einen (einfachen) Lexer schreiben, dann kannst du das mit einer einfachen Rekursion direkt umsetzen nach SQL.
Wo ist denn dein konkretes Problem?
再见,
克里斯蒂安
Hallo Christian!
_and_(value1,_not_(_or_(value2,value3)))
absolut richtig.
Naja, durch die Syntax liegt der Code ja schon in (serialisierter) Baum-Form vor. Da musst du ja nur noch einen (einfachen) Lexer schreiben, dann kannst du das mit einer einfachen Rekursion direkt umsetzen nach SQL.
Wo ist denn dein konkretes Problem?
Konkretes Problem: ich habe noch nie einen Lexer geschrieben bzw. meine Vorlesungen in Sachen Parser-Theorie sind gute 10 Jahre her. Ich hatte gehofft, das umgehen zu können, da die Syntax so schön schlicht ist. Ich nehme an, Du kannst mir da keine Hoffnungen machen?
Wenn nicht, dann werde ich mich wohl mit den in meinem Ursprungsposting genannten PEAR-Tools auseinander setzen müssen...
VG ganymede
你好 ganymede,
Naja, durch die Syntax liegt der Code ja schon in (serialisierter) Baum-Form vor. Da musst du ja nur noch einen (einfachen) Lexer schreiben, dann kannst du das mit einer einfachen Rekursion direkt umsetzen nach SQL.
Wo ist denn dein konkretes Problem?
Konkretes Problem: ich habe noch nie einen Lexer geschrieben bzw. meine Vorlesungen in Sachen Parser-Theorie sind gute 10 Jahre her. Ich hatte gehofft, das umgehen zu können, da die Syntax so schön schlicht ist. Ich nehme an, Du kannst mir da keine Hoffnungen machen?
Naja, einen richtigen™ Parser benötigst du dafür nicht. Ich sag ja, durch die Syntax kannst du das 1:1 umsetzen in SQL.
Aber um einen vernünftigen Lexer wirst du vermutlich nicht herum kommen, wenn du nicht gerade frickeln willst. So einfach, dass man ohne auskäme, ist die Syntax auch wieder nicht ;) Wenn du das möchtest, müsstest du auf Syntax wie value1 & !(value2 | value3)
zurückgreifen.
再见,
克里斯蒂安