ScriptObject ParseOperate(CodeOperator operate)
{
TokenType type = operate.Operator;
ScriptObject left = ResolveOperand(operate.Left);
switch (type) {
case TokenType.Plus:
ScriptObject right = ResolveOperand(operate.Right);
if (left is ScriptString || right is ScriptString) {
return new ScriptString(m_script, left.ToString() + right.ToString());
}
return left.Compute(type, right);
case TokenType.Minus:
case TokenType.Multiply:
case TokenType.Divide:
case TokenType.Modulo:
case TokenType.InclusiveOr:
case TokenType.Combine:
case TokenType.XOR:
case TokenType.Shr:
case TokenType.Shi:
return left.Compute(type, ResolveOperand(operate.Right));
case TokenType.And:
if (!left.LogicOperation()) return m_script.False;
return m_script.CreateBool(ResolveOperand(operate.Right).LogicOperation());
case TokenType.Or:
if (left.LogicOperation()) return m_script.True;
return m_script.CreateBool(ResolveOperand(operate.Right).LogicOperation());
case TokenType.Equal:
return m_script.CreateBool(left.Equals(ResolveOperand(operate.Right)));
case TokenType.NotEqual:
return m_script.CreateBool(!left.Equals(ResolveOperand(operate.Right)));
case TokenType.Greater:
case TokenType.GreaterOrEqual:
case TokenType.Less:
case TokenType.LessOrEqual:
return m_script.CreateBool(left.Compare(type, ResolveOperand(operate.Right)));
default:
throw new ExecutionException(m_script, "不支持的运算符 " + type);
}
}
ScriptObject ParseTernary(CodeTernary ternary)