Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
 /// <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);
     }
 }
Ejemplo n.º 3
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);
        }
Ejemplo n.º 4
0
        /// <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);
        }