schmitzm.lang.tree
Class OperationTreeParser

java.lang.Object
  extended by schmitzm.lang.tree.OperationTreeParser
All Implemented Interfaces:
ParserOperatorsHints
Direct Known Subclasses:
FeatureOperationTreeParser, RasterOperationTreeParser

public class OperationTreeParser
extends Object
implements ParserOperatorsHints

Diese Klasse stellt einen Parser fuer einen Operator-Baum dar. Dieser erstellt einen Operator-Baum aus einem Formel-String, der folgende Teilen bestehen darf:


Damit boolesche Operatoren und arithmetische Ausdruecke kombiniert werden koennen, werden die Operanden und das Ergebis einer booleschen Operation nicht als TRUE oder FALSE, sondern numerisch codiert:
Operanden: op > 0 entspricht TRUE; op = 0 entspricht FALSE.
Ergebnis: TRUE wird als 1 codiert; FALSE wird als 0 codiert.

Version:
1.0
Author:
Martin Schmitz (University of Bonn/Germany)

Field Summary
protected  Vector<String> avOperators
          Contains the operators available to create a valid rule.
protected  Map<String,String> avOperatorsKeys
          Contains a resource key postfix for each operator in avOperators, because not all operators (e.g. "=") can be used as resource key in property files.
protected  String delimiter
          Entaehlt die Delimiter des Tokenizers tok.
protected  StringBuffer openBrackets
          Stellt einen Stack dar, auf den die geoeffneten Klammern gelegt werden.
protected  PushbackStringTokenizer tok
          Tokenizer auf den Formel-String.
 
Constructor Summary
OperationTreeParser()
          Erzeugt eine neue Instanz des Parsers.
 
Method Summary
 boolean checkCorrespondingBrackets(char openBracket, char closeBracket)
          Prueft, ob eine oeffnende und eine schliessende Klammer zueinander korrespondieren.
 String getAdditionOperatorChars()
          Liefert die Zeichen, die als arithmetische Strich-Operatoren verwendet werden.
 String getBooleanOperatorChars()
          Liefert die Zeichen, die als boolesche Operatoren verwendet werden.
 String getClosingBracketChars()
          Liefert die Zeichen, die als schliessende Klammern verwendet werden.
 String getCompareOperatorChars()
          Liefert die Zeichen, die fuer Vergleichsoperatoren verwendet werden.
 String getConnectingOperatorChars()
          Deprecated. wegen booleschen Operatoren muss eine Verbindungs-Prioritaet verwendet werden; ersetzt durch getOperatorConnectivity(String)
protected  Object getConstantFromString(String token)
          Liefert einen Double- oder String-Wert aus einem String.
protected  double getDoubleFromString(String token)
          Liefert einen Double-Wert aus einem String.
protected  int getIntFromString(String token)
          Liefert einen Integer-Wert aus einem String.
protected  int getMaximumOperatorConnectivity()
          Liefert den Konnektivitaetswert des am meisten bindenden Operators.
 String getMultiplyOperatorChars()
          Liefert die Zeichen, die als arithmetische Punkt-Operatoren verwendet werden.
 String getOpeningBracketChars()
          Liefert die Zeichen, die als oeffnende Klammern verwendet werden.
 String getOperatorChars()
          Liefert die Zeichen, die als 2-stellige Operatoren verwendet werden.
 int getOperatorConnectivity(String operator)
          Liefert einen Wert, der die Konnektivitaet (Bindung) eines Operators ausdrueckt (je groesser, desto groesser die Bindung).
 String getOperatorDescription(String operator)
          Returns an (internationalised) description for an operator.
 int getOperatorParameterCount(String op)
          Returns the number of bracked-enclosed parameters for an operator.
 Vector<String> getOperators()
          Returns the operators, which are available for creating a valid rule.
 String getOperatorTitle(String operator)
          Returns a short (internationalised) title for an operator.
 String getParameterSeperatorChars()
          Liefert die Zeichen, die als Trennzeichen zwischen Funktionsparametern verwendet werden.
 String getStringEncapsulationChars()
          Liefert die Zeichen, zwischen denen String-Konstanten gekapselt werden.
protected  void initOperatorKeys()
          Initialises the localisation key list for the available operators.
protected  void initOperatorList()
          Initialises the list of available operators.
 boolean isAdditionOperator(String token)
          Prueft, ob es sich bei einem String um einen Strich-Operator handelt.
 boolean isBooleanOperator(String token)
          Prueft, ob es sich bei einem String um einen booleschen Operator handelt.
 boolean isClosingBracket(String token)
          Prueft, ob es sich bei einem String um eine schliessende Klammer handelt.
 boolean isCompareOperator(String token)
          Prueft, ob es sich bei einem String um einen Vergleichsoperator handelt.
 boolean isConnectingOperator(String operator)
          Deprecated. wegen booleschen Operatoren muss eine Verbindungs-Prioritaet verwendet werden; ersetzt durch getOperatorConnectivity(String)
 boolean isMultiplyOperator(String token)
          Prueft, ob es sich bei einem String um einen Punkt-Operator handelt.
 boolean isOpeningBracket(String token)
          Prueft, ob es sich bei einem String um eine oeffnende Klammer handelt.
 boolean isOperatorChar(String token)
          Prueft, ob es sich bei einem String um einen Operator handelt.
 boolean isParameterSeperator(String token)
          Prueft, ob es sich bei einem String um eine schliessende Klammer handelt.
 boolean isStringEncapsulationChar(String token)
          Prueft, ob es sich bei einem String um ein Zeichenketten-kapselndes Zeichen handelt.
protected  String nextNonWSToken()
          Liefert das naechste Token aus dem Tokenizer, das nicht ein White-Space ist.
 OperationTree parse(String rule)
          Erstellt einen Operator-Baum aus einem Formel-String.
protected  BinaryTreeNode parseLiteral()
          Parst das naechste Literal aus dem Tokenizer tok.
protected  BinaryTreeNode parseOperand(int minOperatorConn)
          Parst den naechsten Operand aus dem Tokenizer tok.
protected  BinaryTreeNode parseRule()
          Parst eine komplette Formel, bis zum Ende der Eingabe-Formel oder einem Parameter-Trenner.
protected  BinaryTreeNode parseRulePart()
          Parst die naechste Teil-Formel aus dem Tokenizer tok.
protected  void pushbackWithWSToken()
          Legt solange Token zurueck auf den Tokenizer, bis das zurueckgelegte Token kein White-Space ist.
protected  void throwParseError(String mess)
          Wirft eine IllegalArgumentException mit der angegebenen Fehlermeldung.
protected  void throwParseError(String mess, Throwable err)
          Wirft eine IllegalArgumentException mit der angegebenen Fehlermeldung.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

openBrackets

protected StringBuffer openBrackets
Stellt einen Stack dar, auf den die geoeffneten Klammern gelegt werden. Zeichen 0 stellt das oberste Stack-Element dar.


tok

protected PushbackStringTokenizer tok
Tokenizer auf den Formel-String. Wird beim Starten des Parse-Vorgangs erzeugt.

See Also:
parse(String)

delimiter

protected String delimiter
Entaehlt die Delimiter des Tokenizers tok. Diese setzen sich aus den oeffnenden und schliessenden Klammern zusammen, sowie aus den Operatoren. Wird bei der Instanziierung des OperationTreeParser befuellt.

See Also:
getOpeningBracketChars(), getClosingBracketChars(), getOperatorChars()

avOperators

protected Vector<String> avOperators
Contains the operators available to create a valid rule.
Note: These operators do not effect the parsing process, but only used for user/GUI interaction.


avOperatorsKeys

protected Map<String,String> avOperatorsKeys
Contains a resource key postfix for each operator in avOperators, because not all operators (e.g. "=") can be used as resource key in property files.

Constructor Detail

OperationTreeParser

public OperationTreeParser()
Erzeugt eine neue Instanz des Parsers.

Method Detail

getOpeningBracketChars

public String getOpeningBracketChars()
Liefert die Zeichen, die als oeffnende Klammern verwendet werden. Unterklassen koennen diese Methode ueberschreiben und Zeichen hinzufuegen.

Returns:
"([{"

isOpeningBracket

public boolean isOpeningBracket(String token)
Prueft, ob es sich bei einem String um eine oeffnende Klammer handelt.

Parameters:
token - Zeichenkette
See Also:
getOpeningBracketChars()

getClosingBracketChars

public String getClosingBracketChars()
Liefert die Zeichen, die als schliessende Klammern verwendet werden. Unterklassen koennen diese Methode ueberschreiben und Zeichen hinzufuegen.

Returns:
")]}"

isClosingBracket

public boolean isClosingBracket(String token)
Prueft, ob es sich bei einem String um eine schliessende Klammer handelt.

Parameters:
token - Zeichenkette
See Also:
getClosingBracketChars()

checkCorrespondingBrackets

public boolean checkCorrespondingBrackets(char openBracket,
                                          char closeBracket)
Prueft, ob eine oeffnende und eine schliessende Klammer zueinander korrespondieren. Unterklassen muessen diese Methode ueberschreiben und erweitern, wenn weitere Klammer-Zeichen verwendet werden.

Parameters:
openBracket - oeffnende Klammer
closeBracket - schliessende Klammer

getStringEncapsulationChars

public String getStringEncapsulationChars()
Liefert die Zeichen, zwischen denen String-Konstanten gekapselt werden. Unterklassen koennen diese Methode ueberschreiben und Zeichen hinzufuegen.

Returns:
"'

isStringEncapsulationChar

public boolean isStringEncapsulationChar(String token)
Prueft, ob es sich bei einem String um ein Zeichenketten-kapselndes Zeichen handelt.

Parameters:
token - Zeichenkette
See Also:
getStringEncapsulationChars()

getParameterSeperatorChars

public String getParameterSeperatorChars()
Liefert die Zeichen, die als Trennzeichen zwischen Funktionsparametern verwendet werden. Unterklassen koennen diese Methode ueberschreiben und Zeichen hinzufuegen.

Returns:
",;"

isParameterSeperator

public boolean isParameterSeperator(String token)
Prueft, ob es sich bei einem String um eine schliessende Klammer handelt.

Parameters:
token - Zeichenkette
See Also:
getClosingBracketChars()

getOperatorChars

public String getOperatorChars()
Liefert die Zeichen, die als 2-stellige Operatoren verwendet werden. Unterklassen koennen diese Methode ueberschreiben und Zeichen hinzufuegen.


isOperatorChar

public boolean isOperatorChar(String token)
Prueft, ob es sich bei einem String um einen Operator handelt.

Parameters:
token - Zeichenkette
See Also:
getOperatorChars()

getMultiplyOperatorChars

public String getMultiplyOperatorChars()
Liefert die Zeichen, die als arithmetische Punkt-Operatoren verwendet werden. Unterklassen koennen diese Methode ueberschreiben und Zeichen hinzufuegen.

Returns:
"/*^"

isMultiplyOperator

public boolean isMultiplyOperator(String token)
Prueft, ob es sich bei einem String um einen Punkt-Operator handelt.

Parameters:
token - Zeichenkette
See Also:
getMultiplyOperatorChars()

getAdditionOperatorChars

public String getAdditionOperatorChars()
Liefert die Zeichen, die als arithmetische Strich-Operatoren verwendet werden. Unterklassen koennen diese Methode ueberschreiben und Zeichen hinzufuegen.

Returns:
"+-"

isAdditionOperator

public boolean isAdditionOperator(String token)
Prueft, ob es sich bei einem String um einen Strich-Operator handelt.

Parameters:
token - Zeichenkette
See Also:
getAdditionOperatorChars()

getBooleanOperatorChars

public String getBooleanOperatorChars()
Liefert die Zeichen, die als boolesche Operatoren verwendet werden. Unterklassen koennen diese Methode ueberschreiben und Zeichen hinzufuegen.

Returns:
"&|!"

isBooleanOperator

public boolean isBooleanOperator(String token)
Prueft, ob es sich bei einem String um einen booleschen Operator handelt.

Parameters:
token - Zeichenkette

getCompareOperatorChars

public String getCompareOperatorChars()
Liefert die Zeichen, die fuer Vergleichsoperatoren verwendet werden. Unterklassen koennen diese Methode ueberschreiben und Zeichen hinzufuegen.

Returns:
"=<>!"

isCompareOperator

public boolean isCompareOperator(String token)
Prueft, ob es sich bei einem String um einen Vergleichsoperator handelt.

Parameters:
token - Zeichenkette

getOperatorConnectivity

public int getOperatorConnectivity(String operator)
Liefert einen Wert, der die Konnektivitaet (Bindung) eines Operators ausdrueckt (je groesser, desto groesser die Bindung). Punkt-Operatoren haben die groesste Bindung fuer die Operanden, werden also als erstes ausgewertet. Darauf folgen die Strich-Operatoren, dann die Vergleichsoperatoren und am Ende die booleschen Operatoren

Parameters:
operator - Operator
Returns:
0, falls kein bekannter Operator uebergeben wird

getMaximumOperatorConnectivity

protected int getMaximumOperatorConnectivity()
Liefert den Konnektivitaetswert des am meisten bindenden Operators. Unterklasse muessen diese Methode u.U. ueberschreiben, wenn durch Ueberschreiben der Methode getOperatorConnectivity(String) die Prioritaeten der Operatoren veraendert werden.


getConnectingOperatorChars

public String getConnectingOperatorChars()
Deprecated. wegen booleschen Operatoren muss eine Verbindungs-Prioritaet verwendet werden; ersetzt durch getOperatorConnectivity(String)

Liefert die 2-stellige Operatoren, die zwei Operanden aneinander binden (Punkt-Operatoren). Unterklassen koennen diese Methode ueberschreiben und Zeichen hinzufuegen.

Returns:
"/*^"

isConnectingOperator

public boolean isConnectingOperator(String operator)
Deprecated. wegen booleschen Operatoren muss eine Verbindungs-Prioritaet verwendet werden; ersetzt durch getOperatorConnectivity(String)

Prueft, ob es sich bei einem 2-stelligen Operator um einen verbindenen Operator handelt (Punkt-Operator).

Parameters:
operator - 2-stelliger Operator
See Also:
getConnectingOperatorChars()

parse

public OperationTree parse(String rule)
Erstellt einen Operator-Baum aus einem Formel-String.

Parameters:
rule - Formel

parseRule

protected final BinaryTreeNode parseRule()
Parst eine komplette Formel, bis zum Ende der Eingabe-Formel oder einem Parameter-Trenner.


parseRulePart

protected final BinaryTreeNode parseRulePart()
Parst die naechste Teil-Formel aus dem Tokenizer tok. Eine (geklammerter) Teilformel ist eine durch Strich-Operatoren verbundene Kette von Operanden.


parseOperand

protected final BinaryTreeNode parseOperand(int minOperatorConn)
Parst den naechsten Operand aus dem Tokenizer tok. Ein Operand ist eine durch Operatoren gleicher Konnektivitaet verbundene Kette von Literalen und geklammerten Teil-Formeln.

Parameters:
minOperandConn - minimale Konnektivitaet fuer den Operanden (bei einem Operator mit kleinerer Konnektivitaet wird der Operand beendet)

parseLiteral

protected BinaryTreeNode parseLiteral()
Parst das naechste Literal aus dem Tokenizer tok. Ein Literal ist eine numerische Konstante, ein Alias oder ein 1-stelliger Operator auf einer geklammerten Teil-Formel. Diese Methode unterstuetzt
  • als 1-stellige Operatoren
    • Betrag: "abs(.)"
    • Wurzel: "sqr(.)" oder "sqrt(.)"
    • Runden: "rnd(.)" oder "round(.)"
    • Abschneiden: "int(.)" oder "trunc(.)"
    • boolesches NICHT: "!(.)" oder "not(.)"
    • Test auf "Not a Number" (NaN): "isNaN(.)"
    • Sinus: "sin(.)"
    • Cosinus: "cos(.)"
    • Tangens: "tan(.)"
    • Arcus-Sinus: "arcsin(.)" oder "asin(.)"
    • Arcus-Cosinus: "arccos(.)" oder "acos(.)"
    • Arcus-Tangens: "arctan(.)" oder "atan(.)"
    • Exponentialfunktion: "exp(.)"
    • Logarithmus zur Basis e: "ln(.)"
    • Logarithmus zur Basis 10: "log(.)"
    • Umwandlung Zahl-zu-String: "str(.)"
    • Umwandlung String-zu-Zahl: "val(.)"
    • Laenge eines Strings: "len(.)"
    • Umwandlung in Gross-Buchstaben: "toupper(.)"
    • Umwandlung in Klein-Buchstaben: "tolower(.)"
  • als Alias (0-stellige Operatoren)
    • Zufallszahl zwischen 0 und 1: "rand" oder "random"
    • "Not a number" (NaN): "NaN"
  • als Sonderfaelle
    • IF .. THEN .. ELSE ..: "ITE(.,.,.)"
Sub-Klassen muessen diese Methode erweitern, wenn z.B. (alphanumerische) Variablen oder zusaetzliche 1-stellige Operatoren beruecksichtigt werden sollen!!


throwParseError

protected void throwParseError(String mess)
Wirft eine IllegalArgumentException mit der angegebenen Fehlermeldung. Als zusaetzlicher Hinweis wird das Formel-Praefix ausgegeben nach dem der Fehler aufgetreten ist.

Parameters:
mess - Fehler-Meldung

throwParseError

protected void throwParseError(String mess,
                               Throwable err)
Wirft eine IllegalArgumentException mit der angegebenen Fehlermeldung. Als zusaetzlicher Hinweis wird das Formel-Praefix ausgegeben nach dem der Fehler aufgetreten ist.

Parameters:
mess - Fehler-Meldung
err - verursachender Fehler

getConstantFromString

protected Object getConstantFromString(String token)
Liefert einen Double- oder String-Wert aus einem String. String-Konstanten muessen in " oder ' gekapselt sein, um als solche interpretiert zu werden. Die Wildcards TRUE und FALSE werden in 1 bzw. 0 umgewandelt.

Parameters:
token - umzuwandelnde Zeichenkette
Throws:
IllegalArgumentException - falls die Umwandlung nicht vorgenommen werden kann

getIntFromString

protected int getIntFromString(String token)
Liefert einen Integer-Wert aus einem String.

Parameters:
token - umzuwandelnde Zeichenkette
Throws:
IllegalArgumentException - falls die Umwandlung nicht vorgenommen werden kann

getDoubleFromString

protected double getDoubleFromString(String token)
Liefert einen Double-Wert aus einem String.

Parameters:
token - umzuwandelnde Zeichenkette
Throws:
IllegalArgumentException - falls die Umwandlung nicht vorgenommen werden kann

nextNonWSToken

protected String nextNonWSToken()
Liefert das naechste Token aus dem Tokenizer, das nicht ein White-Space ist.


pushbackWithWSToken

protected void pushbackWithWSToken()
Legt solange Token zurueck auf den Tokenizer, bis das zurueckgelegte Token kein White-Space ist.


initOperatorList

protected void initOperatorList()
Initialises the list of available operators.

See Also:
getOperators(), avOperators

initOperatorKeys

protected void initOperatorKeys()
Initialises the localisation key list for the available operators.

See Also:
avOperatorsKeys

getOperators

public Vector<String> getOperators()
Returns the operators, which are available for creating a valid rule.
This method is not used for the parsing process, but only for GUI/User interaction!

Specified by:
getOperators in interface ParserOperatorsHints

getOperatorTitle

public String getOperatorTitle(String operator)
Returns a short (internationalised) title for an operator.

Specified by:
getOperatorTitle in interface ParserOperatorsHints
Parameters:
operator - an operator
Returns:
null if operator is undefined

getOperatorDescription

public String getOperatorDescription(String operator)
Returns an (internationalised) description for an operator.

Specified by:
getOperatorDescription in interface ParserOperatorsHints
Parameters:
operator - an operator
Returns:
null if operator is undefined

getOperatorParameterCount

public int getOperatorParameterCount(String op)
Returns the number of bracked-enclosed parameters for an operator.

Specified by:
getOperatorParameterCount in interface ParserOperatorsHints
Parameters:
op - an operator
Returns:
0 if operator is undefined