Boolean und Math Expression Parser
Ich Schreibe eine Anwendung, die ermöglicht es einem Benutzer, geben Sie einen boolean-Ausdruck. Ich brauche die Fähigkeit zum auswerten der eingegebenen booleschen Ausdruck, der zur Laufzeit und bin auf der Suche nach sowohl einen parser als auch einen expressoin validator.
Parser
Der parser muss einen boolean-Ausdruck als string und return true/false.
Beispiel:
string Ausdruck = "(1 == 1) && (1 > 0)"; Parser parser = new Parser(); boolean result = parser.parse(expression); //Ergebnis True sein sollte.
Neben der Bearbeitung von boolschen Ausdrücken, die ich auch brauchen, es zu verarbeiten Math.
Ausdruck = "((1 + 1 * 2) == 1)"; result = parser.parse(expression); //Ergebnis False sein sollte.
Überprüfen
So, dass ich sagen kann der Benutzer, wenn es ein problem mit dem Ausdruck eingegeben werden, ich brauche auch einen Weg, um die syntax zu validieren.
Arbeite ich in C# mit dem .NET Compact Framework, aber wenn Sie wissen, dass sich etwas in einer anderen Sprache geschrieben, die hilfreich sein können.
Vielen Dank für jede Hilfe, die Sie bieten können.
Tom
Du musst angemeldet sein, um einen Kommentar abzugeben.
http://www.antlr.org
Antlr-Grammatiken können so gestaltet werden, dass sowohl die Analyse und Auswertung.
Hier ein Beispiel: http://www.antlr.org/wiki/display/ANTLR3/Expression+Prüfer
Unser Projekt ist mit NCalc (mit ANTLR darunter sind das sogenannte Lexing/parsing) und wir sind sehr glücklich mit ihm.
Unsere Anwendung erfordert, dass es cross-kompiliert werden sowohl für Voll-und Compact Frameworks. Mit relativ einfachen Optimierungen, konnten wir beide NCalc und ANTLR-Arbeit für beide framework-Aromen.
Vorausgesetzt, Sie können ändern Sie die syntax leicht, lassen Sie eine eingebettete Datenbank, die Arbeit für Sie mit einer Abfrage wie dieser T-SQL:
Mit Ihrem Beispiel:
Ich weiß nicht, alle Bibliotheken um dies zu erleichtern, aber Sie wirklich nur noch zwei Teilproblemen hier. Sie brauchen, um zu bauen ein infix zu postfix-Konverter, dann schreiben Sie ein basic-Rechner für die Boolesche und mathematische Operationen.
Sobald Sie Ihre boolean tree/stack gebaut, beginnen, die Durchführung von Operationen. Wenn Sie etwas haben, das ist nicht eine Zahl, bewerten es durch das senden der Zeichenfolge - /- Ausdruck, um das arithmetische Rechner führt, die infix->postfix Konvertierung und dann einen Wert zurückgibt.
Wenn Sie google "infix nach postfix" und "stack" rpn calculator", können Sie wahrscheinlich finden mehr Ressourcen.
Können Sie in der Lage zu verwenden, die dotMath Bibliothek, dies zu tun.
Hier eine hervorragende Bewertung parser auf Codeproject, verwendet die eval-Methode und stützt sich nicht auf CodeDOM oder etwas ähnliches. Hier ist ein ausgezeichneter Artikel über den Aufbau einer Ausdrucksauswertung mit Antlr, auch auf der gleichen Seite..
Hoffe, das hilft,
Beste Grüße,
Tom.
Diese Art der Sache ist F#'s Brot und butter. Sie könnten probieren. Für das Parsen, verwenden rekursive Abstieg, dann können Sie über die Baumstruktur, die Ergebnisse. Wenn Sie die Kontrolle über den Eingang Sprache, die Sie bekommen können, indem Sie mit einem Zitat Betrieb.