Boolean Expression Ausdruck auswerten in C++
-
Hi,
ich habe eine Eingabemaske in der der User einen boolschen Ausdruck eingeben kann z.b.:
(F AND D) OR (V AND C)F, D, V und C sind Chemikalien. Nun Gibt es viele Files die ich durchsuchen lassen moechte ob die Chemikalien darin vorhanden sind. In den Files steht dann z.B.:
(D AND F)Wie kann ich nun ueberpruefen ob der vom Beuntzer eingegebene Ausdruck einen Treffer ergab.
Im obigen Beispiel muss es ja einen Treffer geben (obwohl die Reihenfolge von D und F vertauscht ist).
Wie man Boolsche Ausdruecke parst habe ich bereits hier gefunden: http://stackoverflow.com/questions/8706356/boolean-expression-grammar-parser-in-cHat jemand eine Idee?
Besten Dank

-
Leg dir für jeden Dateiausdruck eine Map an und setze die dort vorkommenden Variablen auf true.
Gehe dann den boolschen (Eingabemaske-)Ausdruck (am besten schon als AST gesparst) durch und ersetze alle Variablen entsprechend der obigen Map (d.h. für bekannte Variablen auf true, alle anderen auf false setzen) und werte den Ausdruck aus: wenn 'true', dann paßt die Eingabemaske auf den Ausdruck aus der Datei.Was kann denn noch alles an Ausdrücken in den Dateien (Files) stehen? Besonders wenn auch NOT(!) oder andere boolsche Operatoren vorkommen können, dann wird es schwieriger.
PS: Generell gilt ja bei so einer Überprüfung:
if (X AND Mask) then 'hit'
-
Hi,
hatte ich vergessen zu sagen. Die Ausdruecke koennen nur die Operatoren AND, OR und () beinhalten.
Deine Idee klingt sehr gut, ich fasse zusammen ob ich es richtig verstanden habe:
1.) Gehe jede Datei durch und erzeuege eine Map in der die Variablennamen als Key eingefuegt werden und "true" als Wert (falls vorhanden)
2.) Gehe den Ausdruck in der Suchmaske durch und gucke ob die Variablen die der Nutzer eingegeben hat in Map vorhanden sind, falls ja ersetze den Variablen-Namen im Ausdruck durch true, falls nicht vorhanden mit false.
3.) Werte den Ausdruck dann aus, falls true, es ist ein hit sonst nicht.
Wie kann man in C++ den dritten Punkt am einfachsten realisieren?
Besten Dank

-
MrSnister schrieb:
Wie kann man in C++ den dritten Punkt am einfachsten realisieren?
Hast du doch selber schon verlinkt:
Wie man Boolsche Ausdruecke parst habe ich bereits hier gefunden: http://stackoverflow.com/ ....... ssion-grammar-parser-in-c
Nachdem du deinen Baum erzeugt hast, gehst du ihn eben rekursiv durch. Der Wert eines Knotens ist eben entweder der Wert, der da steht, oder das Ergebnis der Operation, die da steht. Um eine Operation auszuwerten, nimmst du das Ergebnis der beiden Teilbäume links und rechts und wendest eben die vom Knoten gegebene Operation an.
-
SeppJ schrieb:
MrSnister schrieb:
Wie kann man in C++ den dritten Punkt am einfachsten realisieren?
Hast du doch selber schon verlinkt:
Wie man Boolsche Ausdruecke parst habe ich bereits hier gefunden: http://stackoverflow.com/ ....... ssion-grammar-parser-in-c
Nachdem du deinen Baum erzeugt hast, gehst du ihn eben rekursiv durch. Der Wert eines Knotens ist eben entweder der Wert, der da steht, oder das Ergebnis der Operation, die da steht. Um eine Operation auszuwerten, nimmst du das Ergebnis der beiden Teilbäume links und rechts und wendest eben die vom Knoten gegebene Operation an.
Stimmt. Hatte ich vergessen
