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;
}