-1

Java で Lisp 式を評価するためにこのプログラムを作成しましたが、実行時に null ポインター例外が発生しています。これが私のコードです。

import java.util.Queue;
import java.util.LinkedList;
import java.util.Stack;
import java.util.ArrayList;


class IterativeEvaluator2
{ 
    private ExpressionScanner expression;

     public IterativeEvaluator2 (String expression)
    {
        this.expression = new ExpressionScanner(expression);
    }

    public double evaluate(Queue<Double> operandqueue)
    {
            // write your code here to create an explicit context stack
        Stack<Queue> temp_stack = new Stack<Queue>();

        char operator = ' ';
            double operand = 0.0;

            // write your code here to evaluate the LISP expression iteratively
            // you will need to use an explicit stack to push and pop context objects
        while ( expression.hasNextOperator() || expression.hasNextOperand() )
        {

            // Get the open bracket         

            if ( expression.hasNextOperator())    
                {
                operator = expression.nextOperator() ;
                if (operator == '(')
                { 
                    // if the stack is empty then the first bracket is trivial
                    // so this method will be instantiated by null
                    if (temp_stack.empty())
                        temp_stack.push(operandqueue);      
                    // else instantiate an arraylist(Queue)
                    else {
                        operandqueue = new LinkedList<Double>();
                        }
                }

                // push the list into the stack after the closing bracket appears       
                else if (operator == ')')
                {   
                    operand = calculate(operandqueue);
                    operandqueue = temp_stack.pop();
                    if (operandqueue != null)
                        operandqueue.offer(operand);

                }
            // if it is another operator then it must be +,-,/,*
                else {
                    operator = expression.nextOperator();
                    operandqueue.offer( (double) operator ); \\ this is where it says there is an error
                }
            }
            // else it is an operand so just put it in the queue
            else
                operandqueue.offer( (double) expression.nextOperand() ); 
        }
    return operand;
    }

        private double calculate(Queue<Double> some_queue)
        {
                char operator = (char) (some_queue.remove()).intValue();
                double operand1 = 0;
                double operand2;            
                switch(operator){
                    case '+' :  while( !some_queue.isEmpty() )
                            {
                                operand2 = some_queue.remove();  
                                operand1 = operand1 + operand2;         
                            }
                            break;

                    case '-' :  operand1 = some_queue.remove();
                            //checks for negative numbers
                            if (some_queue.isEmpty() )
                                operand1 = 0  -  operand1;
                            else{
                                while ( !some_queue.isEmpty() )
                                {
                                    operand2 = some_queue.remove();
                                    operand1 =  operand1 - operand2;
                                }
                            }
                            break;

                    case '*' :  operand1 = 1;
                            while ( !some_queue.isEmpty() )
                            {
                                operand2 = some_queue.remove();
                                operand1 = operand1*operand2;
                            }
                            break;

                    case '/' :  operand1 = some_queue.remove();
                            if (some_queue.isEmpty() )
                                                    operand1 = 1/operand1 ;
                                                else{
                                                        while (!some_queue.isEmpty())
                                {
                                        operand2 = some_queue.remove();
                                    operand1 = operand1/operand2;                                                                                           }
                            }
                            break;
                }
            return operand1;
        }

    public static void main(String [] args)
    {
        String s =  
        "(+\t(- 6)\n\t(/\t(+ 3)\n\t\t(- \t(+ 1 1)\n\t\t\t3\n\t\t\t1)\n\t\t(*))\n\t(* 2 3 4))";  // = 16.5
        IterativeEvaluator2 myEvaluator = new IterativeEvaluator2(s);
        System.out.println("Evaluating LISP Expression:\n" + s);
        System.out.println("Value is: " + myEvaluator.evaluate(null)); 
    }
}  /* 201340 */

プログラムをコンパイルして実行すると、次のようになります。

Evaluating LISP Expression:
(+  (- 6)
    (/  (+ 3)
        (-  (+ 1 1)
            3
            1)
        (*))
    (* 2 3 4))
Exception in thread "main" java.lang.NullPointerException
    at IterativeEvaluator2.evaluate(IterativeEvaluator2.java:58)
    at IterativeEvaluator2.main(IterativeEvaluator2.java:122)

私が間違っていることについてのアイデアはありますか?

ありがとう、カール

4

1 に答える 1