コード例 #1
0
ファイル: ExpressionParser.cs プロジェクト: argent00/ezEmuera
            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);
            }
コード例 #2
0
            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);
            }
コード例 #3
0
ファイル: ExpressionParser.cs プロジェクト: argent00/ezEmuera
 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("式が異常です");
 }