CSLE.CLS_Expression_Compiler.GetExpressionOp C# (CSharp) Method

GetExpressionOp() private method

private GetExpressionOp ( IList tokens, int pos, int posend ) : int
tokens IList
pos int
posend int
return int
        int GetExpressionOp(IList<Token> tokens, int pos, int posend)
        {
            List<int> oppos = new List<int>();
            int state = 0;//0 表达式 //1 符号
            for (int i = posend; i >= pos; )
            {
                if (state == 0)
                {
                    if (tokens[i].type == TokenType.PUNCTUATION)
                    {
                        if (tokens[i].text == ")" && i > pos)
                        {
                            int dep = 0;
                            for (int j = i - 1; j >= pos; j--)
                            {
                                if (tokens[j].type == TokenType.PUNCTUATION && tokens[j].text == ")")
                                {
                                    dep++;
                                }
                                else if (tokens[j].type == TokenType.PUNCTUATION && tokens[j].text == "(")
                                {
                                    dep--;
                                    if (dep < 0)
                                    {
                                        if (j - 1 > pos && (tokens[j - 1].type == TokenType.IDENTIFIER || tokens[j - 1].type == TokenType.TYPE))
                                        {
                                            i = j - 2;//函数
                                        }
                                        else
                                        {
                                            i = j - 1;
                                        }
                                        break;
                                    }
                                }

                            }
                        }
                        else
                        {
                            return -1;
                        }
                    }
                    else if (tokens[i].type == TokenType.VALUE)
                    {
                        i--;
                        //需要考虑负号的问题
                        if (i == pos || tokens[i - 1].type == TokenType.PUNCTUATION)
                        {
                            i--;
                        }
                    }
                    else if (tokens[i].type == TokenType.STRING || tokens[i].type == TokenType.IDENTIFIER)
                    {
                        i--;
                    }
                    else
                    {
                        return -1;
                    }
                    state = 1;
                }
                else
                {
                    if (tokens[i].type != TokenType.PUNCTUATION) return -1;
                    oppos.Add(i);
                    state = 0;
                    i--;
                }
            }
            if (state == 0) return -1;
            //找出优先级最低的操作符
            int nmax = 0;//优先级
            int npos = -1;//字符
            foreach (int i in oppos)
            {
                int max = 0;
                switch (tokens[i].text)
                {
                    case "<":
                        max = 6;
                        break;
                    case ">":
                        max = 6;
                        break;
                    case "<=":
                        max = 6;
                        break;
                    case ">=":
                        max = 6;
                        break;
                    case "&&":
                        max = 5;
                        break;
                    case "||":
                        max = 5;
                        break;
                    case "==":
                        max = 4;
                        break;
                    case "!=":
                        max = 4;
                        break;
                    case "*":
                        max = 3;
                        break;
                    case "/":
                        max = 3;
                        break;
                    case "+":
                        max = 2;
                        break;
                    case "-":
                        max = 2;
                        break;
                }
                if (max > nmax)
                {
                    nmax = max;
                    npos = i;
                }
            }
            return npos;
        }