private void reduceLastThree() { //if (stack.Count < 2) // throw new ExeEE("不正な時期の呼び出し"); IOperandTerm right = (IOperandTerm)stack.Pop();//後から入れたほうが右側 OperatorCode op = (OperatorCode)stack.Pop(); IOperandTerm left = (IOperandTerm)stack.Pop(); if (OperatorManager.IsTernary(op)) { if (stack.Count > 1) { reduceTernary(left, right, op); return; } throw new CodeEE("式の数が不足しています"); } IOperandTerm newTerm = OperatorMethodManager.ReduceBinaryTerm(op, left, right); stack.Push(newTerm); }
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("式が異常です"); }