Andreas Rozek  

ExpressionParser - Auswerten numerischer Ausdrücke

Bisweilen müssen in einem Programm zur Laufzeit numerische Ausdrücke analysiert und ausgewertet werden - Tabellenkalkulationen und Funktionsplotter sind solche Anwendungen. Runtime Revolution [1] schränkt die Möglichkeit zur Skript-Interpretation außerhalb der Entwicklungsumgebung stark ein - außerdem stellt es keine "Sandbox" zur Verfügung, die das eigentliche Programm vor Schaden bewahren kann.

An dieser Stelle wird deshalb mit dem "ExpressionParser" ein kleiner "Library Stack" vorgestellt, der einen in Textform vorliegenden mathematischen Ausdruck analysieren und innerhalb einer "Sandbox" auswerten kann. Die Menge der unterstützten Konstanten und Funktionen läßt sich dabei sehr leicht erweitern (oder auch einschränken).

Der "Library Stack" sowie eine kleine Beispielanwendung können für Windows, Linux und MacOS X heruntergeladen und nach Belieben in eigenen (kommerziellen wie nicht-kommerziellen) Projekten eingesetzt werden - beide stehen unter der "MIT License" [2] mit der zusätzlichen Einschränkung, daß jegliche Änderungen an dem vom Autor herausgegebenen Original deutlich gekennzeichnet werden müssen - dergestalt, daß der Autor nicht mit diesen Änderungen in Verbindung gebracht werden kann!

Inhaltsübersicht

Um direkt zu einem bestimmten Abschnitt zu gelangen, klicken Sie einfach auf die entsprechende Überschrift:

Installation - "ExpressionParser" in eigene Anwendungen integrieren

Damit der "ExpressionParser" in einer eigenen Anwendung eingesetzt werden kann, muß der "Library Stack" in die Anwendung aufgenommen und von dieser aktiviert werden:

  1. laden Sie die Datei ExpressionParser.rev auf Ihren Rechner herunter und legen Sie sie in ein Verzeichnis Ihrer Wahl,
  2. starten Sie die Runtime Revolution Entwicklungsumgebung und legen Sie einen neuen "MainStack" an,
  3. geben Sie diesem Stack einen Namen (z.B. "XXX"),
  4. öffnen Sie (immer noch innerhalb der Entwicklungsumgebung) den "ExpressionParser",
  5. öffnen Sie den "Stack Inspector" für den "ExpressionParser" und wählen Sie "XXX" als neuen "MainStack".

Wenn Sie jetzt den zuvor angelegten Stack "XXX" sichern, wird der "ExpressionParser" automatisch als "Substack" mitgesichert - und später automatisch mitgeladen.

Jetzt muß der "ExpressionParser" nur noch an geeigneter Stelle (z.B. innerhalb einer "preOpenStack"-Routine) vom "MainStack" aktiviert werden:

  start using stack "ExpressionParser"

Anschließend steht die neu gewonnene Funktionalität zur Verfügung.

Die zentrale Funktion für die Auswertung eines Ausdruckes lautet:

  ValueOf(...)

wobei die Ellipse "..." durch eine Zeichenkette mit dem auszuwertenden Ausdruck zu ersetzen ist.

Kann der übergebene Ausdruck ausgewertet werden, liefert die Funktion dessen Wert zurück, anderenfalls wird eine Ausnahme geworfen.

Innerhalb des "ExpressionParserDemonstrator" wird der Aufruf von "ValueOf" deshalb in eine "try"-Anweisung eingebettet:

  try
put ValueOf(the text of field "ExpressionEntry") into field "ResultView"
set the TextColor of field "ResultView" to "black"
catch Signal
put Signal into field "ResultView"
set the TextColor of field "ResultView" to "red"
end try

Standardmäßig unterstützte Operatoren, Konstanten und Funktionen

Der ExpressionParser versteht folgende Operatoren:

  • +  -  (Addition und Subtraktion)
  • *   /  (Multiplikation und Division)
  • %    (Modulo-Division)
  • \      (Ganzzahl-Division)

Die Punkt-vor-Strich-Regel wird dabei korrekt berücksichtigt. Außerdem können beliebige Unterausdrücke durch runde Klammern gruppiert werden.

Von Haus aus werden folgende Konstanten unterstützt:
  • pi - Kreiszahl
  • e - Eulersche Konstante

Soll innerhalb eines Ausdruckes eine Konstante verwendet werden, ist lediglich der Name der Konstanten anzuschreiben.

Desweiteren kennt der "ExpressionParser" folgende Funktionen:

  • sin, cos, tan - trigonometrische Funktionen
  • asin, acos, atan - trigonometrische Umkehrfunktionen
  • deg2rad - Umwandlung eines Winkels in das entsprechende Bogenmaß
  • rad2deg - Umwandlung eines Bogenmaßes in den entsprechenden Winkel
  • exp, exp2, exp10 - Potenzen der Basen e, 2 und 10
  • ln, log2, log10 - Logarithmen zu den Basen e, 2 und 10
  • sum - liefert die Summe aller Argumente
  • min - liefert das kleinste aller Argumente
  • max - liefert das größte aller Argumente

Mit Ausnahme der letzten drei erwarten alle Funktionen genau ein Argument (dieses darf ebenfalls ein Ausdruck sein). Soll innerhalb eines Ausdruckes eine Funktion aufgerufen werden, muß zunächst der Funktionsname und anschließend in runden Klammern die (Komma-separierte) Liste der Funktionsargumente angeschrieben werden.

Somit wäre

  1 + 2 * sin(30 * pi / 180)

zum Beispiel ein möglicher gültiger Ausdruck (wobei "30 * pi / 180" auch als "deg2rad(30)" geschrieben werden könnte).

Verfügbare Dateien

Folgende Dateien können von hier aus auf den eigenen Rechner heruntergeladen werden:

Bekannte Probleme

Dem Autor sind bislang keine Probleme bekannt.

Literaturhinweise

[1]
RunRev - the World's Easiest Programming Language
(siehe http://www.runrev.com)

Runtime Revolution (oder kurz "RunRev") ist eine kombinierte Laufzeit- und Entwicklungsumgebung für Windows, Linux, MacOS X (und weitere Plattformen) mit einer dem Englischen nachempfundenen Skriptsprache. Ähnlich wie bei dem berühmten Vorgänger "HyperCard" können Änderungen im laufenden Programm vorgenommen und ausprobiert werden - die klassische Unterscheidung zwischen Entwicklungsumgebung und fertigem Programm existiert in dieser Strenge nicht mehr.

[2]
Open Source Initiative OSI - The MIT License
(siehe http://www.opensource.org/licenses/mit-license.php)

Die (manchmal auch "X11-Lizenz" genannte) "MIT-Lizenz" ist eine äußerst einfach gehaltene Lizenz, die die freie Verwendung von Software sicherstellt und den Autor gleichzeitig von jeglicher Haftung freistellt.


http://www.Rozek.de/RunRev/ExpressionParser/index_de.html Stand: 15.10.2009