/// <summary> /// 要素登録 /// </summary> /// <param name="pItem">要素</param> /// <remarks> /// CalculatorItemBaseクラスおよび派生クラスを登録します。 /// 登録する順番は数式に準じます。 /// </remarks> public void Entry(CalculatorItemBase pItem) { if (pItem is CalculatorValueBase) { this.mStackValue.Push((CalculatorValue)pItem); return; } CalculatorOperatorBase opeThis = (CalculatorOperatorBase)pItem; // ( if (opeThis.OperatorType == CalculatorOperatorBase.EnumOperatorType.Open) { this.mStackOperator.Push(opeThis); return; } // ) if (opeThis.OperatorType == CalculatorOperatorBase.EnumOperatorType.Close) { while (true) { CalculatorOperatorBase ope = this.mStackOperator.Pop(); ope.Calculation(this.mStackValue); if (ope.OperatorType == CalculatorOperatorBase.EnumOperatorType.Open) { break; } } return; } if (mStackOperator.Count == 0) { this.mStackOperator.Push(opeThis); return; } CalculatorOperatorBase opeBefore = mStackOperator.Peek(); int priority = opeBefore.ComparePriority(opeThis); if (priority < 0) { this.mStackOperator.Push(opeThis); return; } opeBefore.Calculation(this.mStackValue); mStackOperator.Pop(); this.mStackOperator.Push(opeThis); }
/// <summary> /// 優先順位比較 /// </summary> /// <param name="pTarget">比較対象</param> /// <returns>負=this<pTarget、0=this==pTarget、正=this>pTarget</returns> public int ComparePriority(CalculatorItemBase pTarget) { if (this.Priority < pTarget.Priority) { return(-1); } else if (this.Priority > pTarget.Priority) { return(1); } else { return(0); } }
/// <summary> /// 要素推測・生成 /// </summary> /// <param name="pObject">推測元オブジェクト</param> /// <returns>object</returns> /// <seealso cref="Calculators.OperatorKeyWord"/> /// <remarks> /// pObjectから推測した要素を作成しこれを返します。 /// 推測可能なオブジェクト(文字列)は OperatorKeyWord を参照のこと。 /// OperatorKeyWord に無く、かつIConvertibleを継承するオブジェクトは数値と見なされます。 /// (ex) /// Make("("); /// </remarks> static public object Make(object pObject) { object obj = CalculatorItemBase.Make(InstanceTable, pObject); if (obj != null) { return(obj); } if (pObject is IConvertible) { return(new CalculatorValue(((IConvertible)pObject).ToDouble(CultureInfo.CurrentCulture.NumberFormat))); } return(null); }
/// <summary> /// 要素登録(自動解釈型) /// </summary> /// <param name="pObject">要素</param> /// <remarks> /// 様々な型の要素を判別し、登録します。 /// 詳しくはCalculatorItemBase.Make()メソッドを参照。 /// (ex) /// Entry(1); /// Entry("+"); /// Entry(2); /// </remarks> /// <seealso cref="CalculatorItemBase.Make"/> public void Entry(object pObject) { object obj; string str = pObject.ToString(); if ((str.Length > 0) && (str[0] == '@')) { obj = this.GetItemEventHandler(str); } else { obj = CalculatorItemBase.Make(pObject); } if (obj == null) { throw new ArgumentNullException(); } this.Entry((CalculatorItemBase)obj); }