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
- den Quelltext der "ExpressionParser"-Klasse in Ihr Projekt
integrieren,
- die fertig übersetzte "ExpressionParser"-Klasse in das
Projekt einbinden oder
- 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:
- laden Sie die Datei ExpressionParser.swc
auf Ihren Rechner herunter (legen Sie sie in ein Verzeichnis Ihrer
Wahl),
- legen Sie (sofern noch nicht geschehen) Ihr neues
"Flex Builder"-Projekt an,
- öffnen Sie über das Menü "Project" -> "Properties" den
"Project Properties"-Dialog und wählen Sie darin die Rubrik "Flex Build
Path",
- aktivieren Sie den Reiter "Library Path",
- 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:
- 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,
- laden Sie das Projekt in den FlexBuilder,
- legen Sie (sofern noch nicht geschehen) Ihr neues
"Flex Builder"-Projekt an,
- öffnen Sie über das Menü "Project" -> "Properties" den
"Project Properties"-Dialog und wählen Sie darin die Rubrik "Project
References",
- 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.
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 |
|