4. Umsetzung Zurück | Index | Weiter


4.1 Parser

Der Parser zerlegt eine Zeile gemäß der Grammatik in einzelne Objekte. Dazu wird eine Instanz von MathIterator erzeugt, die den String analysiert und eine Reihe von MathObjects zurückliefert. Diese werden dann daraufhin untersucht, ob sie Teile eines binären Operators sind (z. B. Division). Wenn das so ist, wird aus zwei Objekten ein neues erstellt (z. B. MathFraction)

MathIterator geht zeichenweise folgendermaßen vor:
Zunächst wird versucht herauszufinden, von welchem Typ das aktuelle Zeichen ist.

Bei Klammern wird dabei der Klammerinhalt ermittelt und dafür wieder der Parser aufgerufen, der einen Entsprechenden Baum zurückliefert.

Bei Funktionen wird die Methode execute() der erkannten Funktion aufgerufen. Diese erhält den Argumenttext als Parameter und erzeugt Ihrerseits eine Instanz von ArgumentSplitter, der diesen String gemäß der Grammatik in einzelne Parameter zerlegt.
Es wird dann ein der Funktion entsprechendes Objekt erzeugt und für jeden der erkannten Parameter wird dann wieder der Parser aufgerufen und die entstandenen Objekte als Unterobjekte an das Hauptobjekt angehängt.

Ist so der gesamte String geparst, wird zu guter Letzt wird die Methode requestCompact() des obersten Objekts aufgerufen. Diese durchläuft den Baum und ruft wpr jedes Objekt die Methode compact() auf, die Optimierungen durchführt. So können z. B. MathRows mit nur einem Objekt wegfallen, genauso wie Klammern. Das nötige Wissen über diese Kriterien ist aber nur in den jeweiligen Objekten vorhanden und nicht im Parser.

Objektbaum für "x+1/2-x^2" nach dem Parsen:

Objektbaum für "x+1/2-x^2" nach dem Optimieren:

nach oben

4.2 Darstellung

Der MathObject-Baum berechnet seine Größe und zeichnet sich rekursiv. Nach der Erstellung muß einmal die Methode notifyFontChange() aufgerufen werden mit einem MathFont-Objekt als Parameter. Das MathFont-Objekt verwaltet die Schriften und weist jedem Textobjekt die passende Schrift zu, basierend auf Objekttyp (Text, Symbol) und Schriftgröße.
notifyFontChange bewirkt zwei Dinge:

Ist dies getan, so ist jedem Objekt seine Größe bekannt, da es sowohl die Größen der untergeordneten Objekte als auch deren Position kennt. Die draw-Methode zeichnet dann die Unterobjekte und andere Dinge (wie z. B. Bruchstrich) an die berechneten Positionen.

nach oben

4.3 Kommunikation

Für die Kommunikation im CCL-Labor wird ein Formularfeld genutzt, da diese von der vorhandenen Software automatisch zwischen Klient und Agentenrechner synchronisiert werden. In der Beispielseite befindet sich ein JavaScript, das

Per JavaScript lassen sich nur Methoden des Applet-Objekts aufrufen. Damit das MathComm-Objekt über JavaScript ansprechbar ist, war es nötig, die beiden Funktionen newFormula() und getFormula() in die MathApplet-Klasse zu übernehmen. Diese rufen dann die gleichnamigen Funktionen in MathCommJS auf.

nach oben

  Zurück | Index | Weiter