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. Seit Version 3 stellt ActionScript [1] jedoch endgültig keine "eval"-Funktion mehr zur Verfügung.

An dieser Stelle wird deshalb mit dem "ExpressionParser" eine kleine Klasse vorgestellt, die 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).

Die Klasse selbst sowie eine kleine (mit Adobe Flex [2] erstellte) Beispielanwendung können für alle unterstützten Plattformen heruntergeladen und nach Belieben in eigenen (kommerziellen wie nicht-kommerziellen) Projekten eingesetzt werden - beide stehen unter der "MIT License" [3] 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:

Einbinden des "ExpressionParser" in eigene Anwendungen

Vorbemerkung: die folgende Beschreibung geht davon aus, daß Sie den "ExpressionParser" innerhalb des "Flex Builder" [4] von Adobe einsetzen. Falls Sie für Ihre Entwicklungen eine andere Umgebung verwenden, müssen Sie die Anleitungen entsprechend anpassen.

Grundsätzlich gibt es drei verschiedene Verfahren für die Integration des "ExpressionParser" in eigene "Flex Builder"-Projekte: Sie können

  1. den Quelltext der "ExpressionParser"-Klasse in Ihr Projekt integrieren,
  2. die fertig übersetzte "ExpressionParser"-Klasse in das Projekt einbinden oder
  3. einen Verweis auf das "ExpressionParser"-Projekt anlegen.

Das erstgenannte Verfahren lohnt sich nur, falls Sie vorhaben, den "ExpressionParser" speziell für Ihr vorliegendes Projekt zu modifizieren. Die zweitgenannte Methode ist die einfachste und bietet sich an, wenn Sie sich weder für den Quelltext des "ExpressionParser" interessieren noch vorhaben, diesen jemals zu verändern. Falls Sie die Klasse jedoch an eigene Bedürfnisse anpassen und anschließend mehrfach in Ihren Projekten einsetzen möchten, empfiehlt sich die letztgenannte Vorgehensweise.

Im folgenden werden zunächst die Methoden 2 und 3 genauer beschrieben. Anschließend erfahren Sie, wie Sie den "ExpressionParser" von Ihrem Programm aus aufrufen können.

Einbinden der fertig übersetzten "ExpressionParser"-Klasse

Das Einbinden der fertig übersetzten Klasse in ein eigenes Projekt ist denkbar einfach:

  1. laden Sie die Datei ExpressionParser.swc auf Ihren Rechner herunter (legen Sie sie in ein Verzeichnis Ihrer Wahl),
  2. legen Sie (sofern noch nicht geschehen) Ihr neues "Flex Builder"-Projekt an,
  3. öffnen Sie über das Menü "Project" -> "Properties" den "Project Properties"-Dialog und wählen Sie darin die Rubrik "Flex Build Path",
  4. aktivieren Sie den Reiter "Library Path",
  5. klicken Sie auf "Add SWC..." und führen Sie den "Flex Builder" zu der zuvor heruntergeladenen SWC-Datei.

Nach einem Klick auf "Ok" und dem Verlassen des Dialoges steht Ihnen der "ExpressionParser" zur Verfügung.

Verweis auf ein "ExpressionParser"-Projekt

Das Einbinden des "ExpressionParser" über einen Verweis auf das zugehörige Projekt ist ebenfalls äußerst einfach:

  1. laden Sie die Datei ExpressionParser.zip auf Ihren Rechner herunter und entpacken Sie sie in ein Verzeichnis Ihrer Wahl - am besten dorthin, wo auch Ihre anderen FlexBuilder-Projekte liegen,
  2. laden Sie das Projekt in den FlexBuilder,
  3. legen Sie (sofern noch nicht geschehen) Ihr neues "Flex Builder"-Projekt an,
  4. öffnen Sie über das Menü "Project" -> "Properties" den "Project Properties"-Dialog und wählen Sie darin die Rubrik "Project References",
  5. da Sie das "ExpressionParser"-Projekt zuvor geladen haben, sollte es in der Liste der angebotenen Projekt auftauchen - setzen Sie vor das Projekt einen Haken,

Nach einem Klick auf "Ok" und dem Verlassen des Dialoges steht Ihnen der "ExpressionParser" zur Verfügung.

Aufruf des "ExpressionParser"

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

  ExpressionParser.ValueOf(...)

wobei die Ellipse "..." durch eine Zeichenkette mit dem auszuwertenden Ausdruck zu ersetzen ist (da der "ExpressionParser" nicht in ein eigenes Paket gesteckt wurde, ist zuvor keine "import"-Anweisung erforderlich).

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 {
var Result:Number = ExpressionParser.ValueOf(ExpressionEntry.text);
ResultView.text = String(Result);
} catch (Signal:*) {
ResultView.text = String(Signal);
};

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
  • infinity - "unendlich"

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

Desweiteren kennt der "ExpressionParser" folgende Funktionen:

  • random - liefert eine zufällige Zahl im Bereich 0...1
  • 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
  • ceil - rundet das Argument nach oben auf
  • floor - rundet das Argument nach unten ab
  • round - rundet das Argument zur nächstgelegenen ganzen Zahl
  • sum - liefert die Summe aller Argumente
  • min - liefert das kleinste aller Argumente
  • max - liefert das größte aller Argumente

Mit Ausnahme der ersten und 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).

ExpressionParserDemonstrator - ein Anwendungsbeispiel

Mit dem "ExpressionParserDemonstrator" steht Ihnen auch ein kleines Anwendungsbeispiel für den "ExpressionParser" zur Verfügung. Falls Sie den "Flash Player" (ab Version 9) von Adobe [5] installiert (und außerdem JavaScript aktiviert) haben, können Sie den Demonstrator sogar direkt von Ihrem Browser aus nutzen - anderenfalls sehen Sie nur einen einfachen Bildschirmabzug.

Bildschirmabzug des ExpressionParserDemonstrator - bitte installieren Sie den Adobe Flash Player, um den Demonstrator aus Ihrem Browser heraus zu bedienen

Der Demonstrator verwendet das PreloaderDisplay für Flex-Anwendungen des Autors.

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]
ActionScript Technology Center
(siehe http://www.adobe.com/devnet/actionscript/)

ActionScript ist eine an JavaScript/ECMAscript angelehnte Skriptsprache für Anwendungen auf der Basis von Adobe Flash, geht inzwischen aber sowohl in der Syntax als auch in der Semantik weit über den ECMAscript-Standard hinaus.

[2]
Adobe Flex 3
(siehe http://www.adobe.com/de/products/flex/)

Adobe Flex ist ein (kostenloses) "Framework" für die Erstellung von Anwendungen auf der Basis von Adobe Flash. Im Gegensatz zu Flash selbst (welches eher für Grafiker und Web-Designer gedacht ist), richtet sich Flex explizit an Entwickler und Programmierer.

[3]
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.

[4]
Adobe Flex Builder
(siehe http://www.adobe.com/de/products/flex/)

Der "Flex Builder" ist eine auf Eclipse aufsetzende Entwicklungsumgebung für Flex- (und Flash-)Anwendungen von Adobe. Obwohl nicht kostenlos, ist der "Flex Builder" (vor allem für Adobe-Verhältnisse) erstaunlich preisgünstig.

[5]
Adobe Flash Player
(siehe http://get.adobe.com/de/flashplayer/)

Adobe Flash ist eine Plattform für Multimedia-Inhalte und Anwendungen, die innerhalb eines HTML-Browser angezeigt und ausgeführt werden. Die Laufzeitumgebung (der "Player") kann kostenlos installiert und benutzt werden, die Umgebungen für die Entwicklung von Flash-Inhalten sind z.T. kostenpflichtig.


http://www.Rozek.de/ActionScript/ExpressionParser/index_de.html Stand: 04.11.2009