⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.java

📁 JAVA 数学程序库 提供常规的数值计算程序包
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
        return new CaseToken(null, defaultCode);
    }

    /***********************************************************************************/
    /** parse while(something) { do something }                                        */
    /* @param                                                                            */
    /* @param                                                                           */
    /* @return                                                                         */
    private OperandToken parseWhile()
    {

        // check for "("   (e.g. while(.....  )
        if(!isExpectedDelimiter(peekNextToken(), '(') )
            Errors.throwParserException("while: ERROR missing (");
        else
            getNextToken();

        // get argument inside (...)
        OperandToken whileRelation = parseArithExpression(SINGLE);         

        if(!isExpectedDelimiter(peekNextToken(), ')') )
            Errors.throwParserException("While: ERROR missing )");
        else
            getNextToken();

        ErrorLogger.debugLine("Parser: while after relation");

        // get commands inside {...}
        OperandToken whileCode = parseCommandList();          

        //if (isExpectedDelimiter(peekNextToken(), ',' ) ||
        //    isExpectedDelimiter(peekNextToken(), ';' )   )
        //    getNextToken();

        if(isExpectedDelimiter(peekNextToken(), "end")      ||
           isExpectedDelimiter(peekNextToken(), "endwhile")   )
        {
        	getNextToken();
            ErrorLogger.debugLine("Parser: while: end");
        }
        else 
            Errors.throwParserException(" while error");

        // While(..) {...}
        return (OperandToken)( new WhileOperatorToken(whileRelation, whileCode));
    }


    /***********************************************************************************/
    /** this method parses for loops                                                   */
    /*  (e.g. for(z=0;z<10;z=z+1) { disp(z); } endfor                                       */
    /* @param                                                                            */
    /* @param            				                                               */
    /* @return                                                                         */
    private OperandToken parseFor()
    {
        OperandToken forInitialisation   = null;         
        OperandToken forRelation         = null;                 
        OperandToken forIncrement        = null;         
        
        //skip the opening bracket
        //Token dummy = peekNextToken();
        
        if(isExpectedDelimiter(peekNextToken(), '(') )
        {
            
            //skip the opening bracket
            getNextToken();
            ErrorLogger.debugLine("Parser: for loop");        
    
            // get arguments inside (...;...;...)
            forInitialisation     = parseArithExpression(SINGLE);         
            ErrorLogger.debugLine("Parser: for: initialisation = " + forInitialisation.toString());          
            
            if (!isExpectedDelimiter(peekNextToken(), ';' )) 
                Errors.throwParserException("For: missing ;");
            else
                getNextToken();
                
            forRelation             = parseArithExpression(SINGLE);         
            ErrorLogger.debugLine("Parser: for: relation = " + forRelation.toString());
            
            if (!isExpectedDelimiter(peekNextToken(), ';' )) 
                Errors.throwParserException("For: missing ;");
            else
                getNextToken();
            
            forIncrement             = parseArithExpression(SINGLE);         
            ErrorLogger.debugLine("Parser: for: increment = " + forIncrement.toString());
        
            if (!isExpectedDelimiter(peekNextToken(), ')' )) 
                Errors.throwParserException("For: missing )");
            else
                  getNextToken();
        
        }
        else
        {
            // e.g. for i=1:4   
            // e.g. for i=x
            // e.g. for i=[1,3,5]
            ErrorLogger.debugLine("Parser: FOR vector for loop");        
    
            // get arguments inside for < >, ...  (e.g. for x=[1,2,3], ...)
            forInitialisation     = parseArithExpression(SINGLE); //MATRIX); //SINGLE);
            
            // get rid of the closing , ; \n
            // e.g. for i=2:5,
            // e.g. for i=2:5;
            // e.g. for i=2:5\n
            if (!isExpectedDelimiter(peekNextToken(), ';' ) &&
                !isExpectedDelimiter(peekNextToken(), ',' ) &&
                !isExpectedDelimiter(peekNextToken(), '\n')    ) 
                Errors.throwParserException("For: missing ; , \\n");
            else
                getNextToken();
            
            ErrorLogger.debugLine("ParserFOR" + peekNextToken());
            
            
            //if (!isExpectedDelimiter(peekNextToken(), ',' ) ||
            //    !isExpectedDelimiter(peekNextToken(), '\n' )   ) 
            //    Errors.throwParserException("For: missing , or \\n");
            //else
            //      getNextToken();         
            
            ErrorLogger.debugLine("Parser: for: initialisation = " + forInitialisation.toString());          
        }

        // get commands inside {...}
           OperandToken forCode = parseCommandList();
        
        //if (peekNextToken() instanceof DelimiterToken)
        //    getNextToken();
        
        if(isExpectedDelimiter(peekNextToken(), "end")    ||
           isExpectedDelimiter(peekNextToken(), "endfor")   )
        {
            getNextToken();
            ErrorLogger.debugLine("Parser: for: end");
        }
        else 
            Errors.throwParserException(" for error");
                    
        ErrorLogger.debugLine("Parser: for: code = "+forCode.toString());

        // For(...;...;...) {...}
        return new ForOperatorToken(forInitialisation, forRelation, forIncrement, forCode);
    }


    /***********************************************************************************/
    /** this method parses matrices (e.g. a=[1,2,3;4,5,6] or a=[1 2 3])                */
    /* @return   parsed matrix                                                         */
    private OperandToken parseMatrix()
    {
        boolean endLine          = false;         //
        boolean endMatrix        = false;         //
        int x                    = 0;             // x-size of matrix
        int y                    = 1;             // y-size of matrix
        Stack elements           = new Stack();   // stack for elements
        Stack rowLength          = new Stack();   //
        boolean numberB          = true;          //
        boolean singleB          = true;          //
        boolean numberIndicatorB = false;         //
        boolean singleIndicatorB = false;         //
        boolean imagIndicatorB   = false;         //

        // remove spaces between "[" and first element (e.g. [  2,3] -> [2,3]
        while (isExpectedDelimiter(peekNextToken(MATRIX), ' '))
        		getNextToken();
        
        // parse code of matrices (e.g. [1,2,3;4,5,6] or [1 sin(2) 3; 4 5+1 a]
        while(!endMatrix) 
        {
            // get next parameter (whitespaces are treated as delimiter, too)
            OperandToken nextParameter = parseArithExpression(MATRIX);    

            numberIndicatorB = false;            
            singleIndicatorB = false;
            
            // check type of each parameter: some operands need special attention
            if (nextParameter instanceof Expression)
            {
                Expression expr = (Expression)nextParameter;
                
                if (expr.getData() == null)
                {
                    if (expr.getNumberOfChildren() == 1)
                    {
                        // there is only one parameter
                        singleIndicatorB = true;
                    }
                }
            }
            else if (nextParameter instanceof DoubleNumberToken)
            {
                // this parameter is a number token
                DoubleNumberToken numberT = (DoubleNumberToken)nextParameter;

                // check if matrix has imaginary values
                if (numberT.getValuesIm() != null)
                     imagIndicatorB = true;
                            
                // Check if this number token is a scalar. Otherwise deal with
                // it like a general matrix
                if((numberT.getSizeX()==1) && (numberT.getSizeY()==1))                        
                       numberIndicatorB = true;
            }
            
            if (numberIndicatorB == false)
            {
                // at least one element of the matrix is NOT a number
                numberB = false;
            }
            if (singleIndicatorB == false)
            {
                // at least one element is not a single operand
                singleB = false;
            }

            ErrorLogger.debugLine("Parser: para" + nextParameter);
            // push parameter onto element stack
            if (nextParameter != null)
                elements.push(nextParameter);

            DelimiterToken t = (DelimiterToken)peekNextToken(MATRIX);
    
            if((t.value == ',') ||
               (t.value == ' ')    )
            {
                //this marks the end of a matrix element
                ErrorLogger.debugLine("Parser: Matrix ,");
                getNextToken(MATRIX);
                x++;
            }
            else if((t.value == ';')  ||
                    (t.value == '\n') ||
                    (t.value == '\r')   )
            {
                //this marks the end of a row
                getNextToken(MATRIX);
                x++;
                ErrorLogger.debugLine("Parser: Matrix ; length "+x);
                rowLength.push(new Integer(x)); // save row length 
                x=0;
                y++; // increment row counter
            }
            else if(t.value == ']')
            {
                //this marks the end of the matrix
                getNextToken(MATRIX);
                x++;
                rowLength.push(new Integer(x)); // save row length
                ErrorLogger.debugLine("Parser: Matrix y="+y+" x="+x);
                endMatrix = true;
            }
            else
            {
                Errors.throwParserException(" matrix error");
            }

        } // end while

        // create matrix of correct size
        if (numberB)
        {
            // the parsed matrix is a pure number array
            ErrorLogger.debugLine("Parser: matrix pure numbers");

            // length of rows must be equal
            for (int yy=y-1; yy>=0; yy--)
            {
                if ( ((Integer)rowLength.pop()).intValue() != x)
                    Errors.throwParserException(" Matrix: all rows must have the same length");
            }
            
            double values[][]     = new double[y][x];
            double valuesImag[][] = new double[1][1];

            if (imagIndicatorB)
                valuesImag = new double[y][x];
                
            // fill array with double values from element stack
            for (int yy=y-1; yy>=0; yy--)
            {
                for (int xx=x-1; xx>=0; xx--)
                {
                    DoubleNumberToken n  = (DoubleNumberToken)elements.pop(); 
                    values[yy][xx] = n.getValueRe();
                    if (imagIndicatorB)
                    {
                        valuesImag[yy][xx] = n.getValueIm();
                    }
                }
            }

            if (!imagIndicatorB)
                return  (OperandToken)(new DoubleNumberToken(values));
            else
                return  (OperandToken)(new DoubleNumberToken(values, valuesImag));

        }
        else if (singleB)
        {
            // pure operands (e.g. variables..., [a,b,c])
            ErrorLogger.debugLine("Parser: matrix pure operands");
            OperandToken values[][] = new OperandToken[y][x];

            // fill array with operands from element stack
            for (int yy=y-1; yy>=0; yy--)
            {
                // row length may vary, e.g. a=[b;c,d] 
                x = ((Integer)rowLength.pop()).intValue();
                values[yy] = new OperandToken[x];
                
                for (i

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -