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:
- laden Sie die Datei ExpressionParser.rev
auf Ihren
Rechner herunter und legen Sie sie in ein Verzeichnis Ihrer Wahl,
- starten Sie die Runtime Revolution Entwicklungsumgebung und
legen Sie einen neuen "MainStack" an,
- geben Sie diesem Stack einen Namen (z.B. "XXX"),
- öffnen Sie (immer noch innerhalb der Entwicklungsumgebung)
den "ExpressionParser",
- ö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 |
|