Class Calculator

java.lang.Object
sunlabs.brazil.util.Calculator

public class Calculator extends Object
Calculator implements a simple arithmetic expression evaluator. It can evaluate typical expressions with the "normal" operators and precedence. Formally, the BNF for the supported grammar is:
<stmt>    ::= <var> = <expr> | <expr>
<expr>    ::= <rexpr> | <expr> <bool op> <rexpr>
<bool op> ::= invalid input: '&'invalid input: '&' | <or>
<or>      ::= ||
<rexpr>   ::= <aexpr> | <rexpr> <rel op> <aexpr>
<rel op>  ::= < | <= | > | >= | == | !=
<aexpr>   ::= <term> | <aexpr> <add op> <term>
<add op>  ::= + | -
<term>    ::= <factor> | <term> <mult op> <factor>
<mult op> ::= * | / | %
<factor>  ::= <var> | <num> | ! <factor> | ( <expr> )
<var>     ::= <letter> | <var> <var2>
<var2>    ::= <letterordigit> | . | _
<num>     ::= <unum> | + <unum> | - <unum>
<unum>    ::= <int> | <int> . | <int> . <int> | . <int>
<int>     ::= <digit> | <int> <digit>
A <letter> is defined as a Java char for which Char.isLetter(char) is true. A <letterordigit> is defined as a Java char for which Char.isLetterOrDigit(char) is true. A digit is defined as a Java char for which Char.isDigit(char) is true.

Values for <var> are looked up in the supplied Dictionary. If <var> can not be found, it is assumed to have the value zero. If the value found is "true" or "yes" (case insensitive), it is assumed to be one. Similarly, if the value found is "false" or "no", it is assumed to be zero. Assignment to <var> stores the computed value in the same Dictionary.

The period in <unum>, if there is one, must be immediately adjacent to surrounding <int>s.

Version:
2.4
Author:
Steve Drach <drach@sun.com>
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    boolean
    Set true for debug output.
  • Constructor Summary

    Constructors
    Constructor
    Description
    The no argument constructor will create an internal Hashtable in which it looks up and stores values associated with variables.
    This constructor will use the Dictionary parameter to lookup and store values associated with variables.
  • Method Summary

    Modifier and Type
    Method
    Description
    Computes the value of the statement passed in the parameter string and returns a string representation of the result.
    Computes the value of the statement passed in the parameter string and returns a string representation of the result.
    static void
    main(String[] args)
    A test driver for the calculator.
    void
    stringsValid(boolean allStringsValid)
    Normally, variables whose values are "on", "yes", or "true" and converted to "1.0", while the values "off", "no", and "false" are converted to "0.0".

    Methods inherited from class Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • debugging

      public boolean debugging
      Set true for debug output. The output probably won't make sense to anyone other than the author.
  • Constructor Details

    • Calculator

      public Calculator()
      The no argument constructor will create an internal Hashtable in which it looks up and stores values associated with variables.
      See Also:
    • Calculator

      public Calculator(Dictionary d)
      This constructor will use the Dictionary parameter to lookup and store values associated with variables.
      Parameters:
      d - the Dictionary object that serves as a symbol table
      See Also:
  • Method Details

    • stringsValid

      public void stringsValid(boolean allStringsValid)
      Normally, variables whose values are "on", "yes", or "true" and converted to "1.0", while the values "off", "no", and "false" are converted to "0.0". All other values are considered an error. By passing "true", all normally invalid strings are given a value of "1.0".

    • getValue

      public String getValue(String stmt) throws ArithmeticException
      Computes the value of the statement passed in the parameter string and returns a string representation of the result. If the input statement consists only of a variable name and the result of the computation is zero, null is returned.
      Parameters:
      stmt - a string representation of an arithmetic expression or assignment
      Returns:
      a string representation of the computed result or null
      Throws:
      ArithmeticException - occurs when a result is improper (e.g. infinity) or when the input statement can not be parsed
    • getValue

      public String getValue(String stmt, Dictionary d) throws ArithmeticException
      Computes the value of the statement passed in the parameter string and returns a string representation of the result. If the input statement consists only of a variable name and the result of the computation is zero, null is returned. The second parameter is used as a symbol table for the duration of this method call. Note this method is not thread safe!
      Parameters:
      stmt - a string representation of an arithmetic expression or assignment
      d - the temporary symbol table
      Returns:
      a string representation of the computed result or null
      Throws:
      ArithmeticException - occurs when a result is improper (e.g. infinity) or when the input statement can not be parsed
    • main

      public static void main(String[] args)
      A test driver for the calculator. Type in arithmetic expressions or assignments and see the results. Use "dump" to see contents of all assigned variables.
      Parameters:
      args - required signature for main method, not used