//获取一个Object private CodeObject GetObject() { Stack<TempOperator> operateStack = new Stack<TempOperator>(); Stack<CodeObject> objectStack = new Stack<CodeObject>(); while (true) { objectStack.Push(GetOneObject()); if (!P_Operator(operateStack, objectStack)) break; } while (operateStack.Count > 0) { objectStack.Push(new CodeOperator(objectStack.Pop(), objectStack.Pop(), operateStack.Pop().Operator, m_strBreviary, GetSourceLine())); } CodeObject ret = objectStack.Pop(); if (ret is CodeMember) { CodeMember member = ret as CodeMember; if (member.Calc == CALC.NONE) { Token token = ReadToken(); switch (token.Type) { case TokenType.Assign: case TokenType.AssignPlus: case TokenType.AssignMinus: case TokenType.AssignMultiply: case TokenType.AssignDivide: case TokenType.AssignModulo: case TokenType.AssignCombine: case TokenType.AssignInclusiveOr: case TokenType.AssignXOR: case TokenType.AssignShr: case TokenType.AssignShi: ret = new CodeAssign(member, GetObject(), token.Type, m_strBreviary, token.SourceLine); break; default: UndoToken(); break; } } } if (PeekToken ().Type == TokenType.QuestionMark) { ReadToken(); CodeTernary ternary = new CodeTernary(); ternary.Allow = ret; ternary.True = GetObject(); ReadColon(); ternary.False = GetObject(); return ternary; } return ret; }
ScriptObject ParseTernary(CodeTernary ternary) { return ResolveOperand(ternary.Allow).LogicOperation() ? ResolveOperand(ternary.True) : ResolveOperand(ternary.False); }
ScriptObject ParseTernary(CodeTernary ternary) { ScriptBoolean b = ResolveOperand(ternary.Allow) as ScriptBoolean; if (b == null) throw new ExecutionException(m_script, "三目运算符 条件必须是一个bool型"); return b.Value ? ResolveOperand(ternary.True) : ResolveOperand(ternary.False); }