private int lastPriority() { if (stack.Count < 3) { return(-1); } object temp = (object)stack.Pop(); OperatorCode opCode = (OperatorCode)stack.Peek(); int priority = OperatorManager.GetPriority(opCode); stack.Push(temp); return(priority); }
private int lastPriority() { if (stack.Count < 3) { return(-1); } var temp = stack.Pop(); var opCode = (OperatorCode)stack.Peek(); var priority = OperatorManager.GetPriority(opCode); stack.Push(temp); return(priority); }
public void Add(OperatorCode op) { if (state == 2 || state == 3) { throw new CodeEE("式が異常です"); } if (state == 0) { if (!OperatorManager.IsUnary(op)) { throw new CodeEE("式が異常です"); } stack.Push(op); if (op == OperatorCode.Plus || op == OperatorCode.Minus || op == OperatorCode.BitNot) { state = 2; } else { state = 3; } return; } if (state == 1) { //後置単項演算子の場合は特殊処理へ if (OperatorManager.IsUnaryAfter(op)) { if (hasAfter) { hasAfter = false; throw new CodeEE("後置の単項演算子が複数存在しています"); } if (hasBefore) { hasBefore = false; throw new CodeEE("インクリメント・デクリメントを前置・後置両方同時に使うことはできません"); } stack.Push(op); reduceUnaryAfter(); //前置単項演算子が処理を待っている場合はここで解決 if (waitAfter) { reduceUnary(); } hasBefore = false; hasAfter = true; waitAfter = false; return; } if (!OperatorManager.IsBinary(op) && !OperatorManager.IsTernary(op)) { throw new CodeEE("式が異常です"); } //先に未解決の前置演算子解決 if (waitAfter) { reduceUnary(); } int priority = OperatorManager.GetPriority(op); //直前の計算の優先度が同じか高いなら還元。 while (lastPriority() >= priority) { this.reduceLastThree(); } stack.Push(op); state = 0; waitAfter = false; hasBefore = false; hasAfter = false; return; } throw new CodeEE("式が異常です"); }