10 Stimmen

Umwandlung von C++-Infix in Präfix für logische Bedingungen

Ich möchte einen Ausdruck in C++ auswerten. Um ihn auszuwerten, möchte ich, dass der Ausdruck in ein Präfixformat umgewandelt wird.

Hier ein Beispiel

 wstring expression = "Feature1 And Feature2";

Hier sind mögliche Wege.

 expression = "Feature1 And (Feature2 Or Feature3)";

 expression = "Not Feature1 Or Feature3";

Hier Und , Oder , Nicht sind reservierte Wörter und Klammern (" ( ", ) ) werden für den Geltungsbereich verwendet

Nicht hat höheren Vorrang

Und hat den nächsten Vorrang vor Not

Oder wird auf den nächsten Vorrang vor Und

WEISSER RAUM als Begrenzungszeichen verwendet. Ausdruck hat keine andere Elemente wie TAB , NEWLINE

I no brauchen Arithmetik Ausdrücke. Ich kann die Auswertung vornehmen, aber kann mir jemand helfen, die Zeichenketten in die Präfix-Notation umzuwandeln?

3voto

Jason D Punkte 2282

Sie müssen die Grammatik im Voraus erstellen. Warum also das ganze Parsing von Hand machen. Verwenden Sie stattdessen eine Bibliothek zur Erstellung von Parsern wie Boost-Spirit . Oder lex/yacc oder flex/bison.

Verwenden Sie dann die AST die vom Parser-Builder generiert werden, um die Daten auf beliebige Weise auszugeben. Wie z.B. Infix zu Präfix oder Postfix, ...usw.

1voto

SysAdmin Punkte 5232

Ich vermute, dass Sie die Absicht haben, die Bedingung auszuwerten, und daher keinen vollwertigen Parser benötigen.

Zunächst einmal brauchen Sie hier nicht mit Zeichenketten zu arbeiten. 1. Konvertieren Sie "Merkmal 1" in eine Id (eine ganze Zahl, die ein Merkmal darstellt)

Also, die Aussage "Feature1 And (Feature2 Or Feature3)"; um zu sagen (1 & (2 | 3) Ab hier...können Sie die Standardkonvertierung von Infix in Präfix verwenden und die Präfix-Notation auswerten.

Hier ist der Algorithmus zur Umwandlung von Infix in Präfix http://www.c4swimmers.esmartguy.com/in2pre.htm http://www.programmersheaven.com/2/Art_Expressions_p1

-1voto

Ken Bloom Punkte 54770

Verwenden Sie einen Parsergenerator wie das Lex/Yacc-Paar.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X