Class Calculator


  • public class Calculator
    extends java.lang.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> ::= && | <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 debugging
      Set true for debug output.
    • Constructor Summary

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

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      java.lang.String getValue​(java.lang.String stmt)
      Computes the value of the statement passed in the parameter string and returns a string representation of the result.
      java.lang.String getValue​(java.lang.String stmt, java.util.Dictionary d)
      Computes the value of the statement passed in the parameter string and returns a string representation of the result.
      static void main​(java.lang.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 java.lang.Object

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

      • debugging

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

      • 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:
        Hashtable
      • Calculator

        public Calculator​(java.util.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:
        Dictionary
    • Method Detail

      • 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 java.lang.String getValue​(java.lang.String stmt)
                                  throws java.lang.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:
        java.lang.ArithmeticException - occurs when a result is improper (e.g. infinity) or when the input statement can not be parsed
      • getValue

        public java.lang.String getValue​(java.lang.String stmt,
                                         java.util.Dictionary d)
                                  throws java.lang.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:
        java.lang.ArithmeticException - occurs when a result is improper (e.g. infinity) or when the input statement can not be parsed
      • main

        public static void main​(java.lang.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