/// <summary>
        /// Builds PDDL term from the input data.
        /// </summary>
        /// <param name="term">Input data term.</param>
        /// <returns>Built term.</returns>
        public ITerm Build(InputData.PDDL.Term term)
        {
            Debug.Assert(TermStack.Count == 0);
            TermStack.Clear();

            term.Accept(this);

            Debug.Assert(TermStack.Count == 1);
            return(TermStack.Pop());
        }
        public static void ScanExpression(string input, ref TermStack TStack)
        {
            int            startPositionPointer = 0;
            StringSplitter sSplitter            = new StringSplitter();

            while (startPositionPointer < input.Length)
            {
                try { sSplitter.getTermFromString(input, ref TStack, ref startPositionPointer); }
                catch (ParsingException ex) { Console.Write("{0}, ", ex.ToString()); }
            }
        }
        /// <summary>
        /// Visits the given input data node.
        /// </summary>
        /// <param name="data">Input data node.</param>
        public override void PostVisit(InputData.PDDL.ObjectFunctionTerm data)
        {
            int functionNameId = IdManager.Functions.GetId(data.Name, data.Terms.Count);

            List <ITerm> argumentTerms = new List <ITerm>();

            for (int i = 0; i < data.Terms.Count; ++i)
            {
                argumentTerms.Add(TermStack.Pop());
            }

            TermStack.Push(new ObjectFunctionTerm(new Atom(functionNameId, argumentTerms), IdManager));
        }
Exemple #4
0
        /// <summary>
        /// Grounds the PDDL term.
        /// </summary>
        /// <param name="term">Input data term.</param>
        /// <param name="substitution">Variables substitution.</param>
        /// <param name="referenceState">Reference state.</param>
        /// <returns>Grounded term, i.e. constant name ID.</returns>
        public int Ground(IExpressionTerm term, ISubstitution substitution, State referenceState)
        {
            Debug.Assert(TermStack.Count == 0);
            TermStack.Clear();
            Substitution   = substitution;
            ReferenceState = referenceState;

            term.Accept(this);

            Substitution   = null;
            ReferenceState = null;
            Debug.Assert(TermStack.Count == 1);
            return(TermStack.Pop());
        }
Exemple #5
0
        /// <summary>
        /// Visits expression term.
        /// </summary>
        /// <param name="term">Expression term.</param>
        public void PostVisit(ObjectFunctionTerm term)
        {
            List <int> argumentsList = new List <int>();

            for (int i = 0; i < term.Terms.Count; ++i)
            {
                argumentsList.Add(TermStack.Pop());
            }
            argumentsList.Reverse();

            IGroundedAtom groundedFunctionAtom = new GroundedAtom(term.NameID, argumentsList);

            int groundedConstantValue = ReferenceState.GetObjectFunctionValue(groundedFunctionAtom);

            TermStack.Push(groundedConstantValue);
        }
        /// <summary>
        /// 解析器の本体
        /// </summary>
        /// <param name="wc"></param>
        /// <param name="allowKeywordTo">TOキーワードが見つかっても良いか</param>
        /// <param name="endWith">終端記号</param>
        /// <returns></returns>
        private static IOperandTerm reduceTerm(WordCollection wc, bool allowKeywordTo, TermEndWith endWith, VariableCode varCode)
        {
            TermStack stack = new TermStack();
            //int termCount = 0;
            int          ternaryCount = 0;
            OperatorCode formerOp     = OperatorCode.NULL;
            bool         varArg       = varCode != VariableCode.__NULL__;

            do
            {
                Word token = wc.Current;
                switch (token.Type)
                {
                case '\0':
                    goto end;

                case '"':                        //LiteralStringWT
                    stack.Add(((LiteralStringWord)token).Str);
                    break;

                case '0':                        //LiteralIntegerWT
                    stack.Add(((LiteralIntegerWord)token).Int);
                    break;

                case 'F':                        //FormattedStringWT
                    stack.Add(ToStrFormTerm((StrFormWord)token));
                    break;

                case 'A':                        //IdentifierWT
                {
                    string idStr = (((IdentifierWord)token).Code);
                    if (idStr.Equals("TO", Config.SCVariable))
                    {
                        if (allowKeywordTo)
                        {
                            goto end;
                        }
                        else
                        {
                            throw new CodeEE("TOキーワードはここでは使用できません");
                        }
                    }
                    else if (idStr.Equals("IS", Config.SCVariable))
                    {
                        throw new CodeEE("ISキーワードはここでは使用できません");
                    }
                    stack.Add(reduceIdentifier(wc, idStr, varCode));
                    continue;
                }

                case '=':                        //OperatorWT
                {
                    if (varArg)
                    {
                        throw new CodeEE("変数の引数の読み取り中に予期しない演算子を発見しました");
                    }
                    OperatorCode op = ((OperatorWord)token).Code;
                    if (op == OperatorCode.Assignment)
                    {
                        if ((endWith & TermEndWith.Assignment) == TermEndWith.Assignment)
                        {
                            goto end;
                        }
                        throw new CodeEE("式中で代入演算子'='が使われています(等価比較には'=='を使用してください)");
                    }

                    if (formerOp == OperatorCode.Equal || formerOp == OperatorCode.Greater || formerOp == OperatorCode.Less ||
                        formerOp == OperatorCode.GreaterEqual || formerOp == OperatorCode.LessEqual || formerOp == OperatorCode.NotEqual)
                    {
                        if (op == OperatorCode.Equal || op == OperatorCode.Greater || op == OperatorCode.Less ||
                            op == OperatorCode.GreaterEqual || op == OperatorCode.LessEqual || op == OperatorCode.NotEqual)
                        {
                            ParserMediator.Warn("(構文上の注意)比較演算子が連続しています。", GlobalStatic.Process.GetScaningLine(), 0, false, false);
                        }
                    }
                    stack.Add(op);
                    formerOp = op;
                    if (op == OperatorCode.Ternary_a)
                    {
                        ternaryCount++;
                    }
                    else if (op == OperatorCode.Ternary_b)
                    {
                        if (ternaryCount > 0)
                        {
                            ternaryCount--;
                        }
                        else
                        {
                            throw new CodeEE("対応する'?'のない'#'です");
                        }
                    }
                    break;
                }

                case '(':
                    wc.ShiftNext();
                    IOperandTerm inTerm = reduceTerm(wc, false, TermEndWith.RightParenthesis, VariableCode.__NULL__);
                    if (inTerm == null)
                    {
                        throw new CodeEE("かっこ\"(\"~\")\"の中に式が含まれていません");
                    }
                    stack.Add(inTerm);
                    if (wc.Current.Type != ')')
                    {
                        throw new CodeEE("対応する')'のない'('です");
                    }
                    //termCount++;
                    wc.ShiftNext();
                    continue;

                case ')':
                    if ((endWith & TermEndWith.RightParenthesis) == TermEndWith.RightParenthesis)
                    {
                        goto end;
                    }
                    throw new CodeEE("構文解釈中に予期しない記号'" + token.Type + "'を発見しました");

                case ']':
                    if ((endWith & TermEndWith.RightBracket) == TermEndWith.RightBracket)
                    {
                        goto end;
                    }
                    throw new CodeEE("構文解釈中に予期しない記号'" + token.Type + "'を発見しました");

                case ',':
                    if ((endWith & TermEndWith.Comma) == TermEndWith.Comma)
                    {
                        goto end;
                    }
                    throw new CodeEE("構文解釈中に予期しない記号'" + token.Type + "'を発見しました");

                case 'M':
                    throw new ExeEE("マクロ解決失敗");

                default:
                    throw new CodeEE("構文解釈中に予期しない記号'" + token.Type + "'を発見しました");
                }
                //termCount++;
                wc.ShiftNext();
            } while (!varArg);
end:
            if (ternaryCount > 0)
            {
                throw new CodeEE("'?'と'#'の数が正しく対応していません");
            }
            return(stack.ReduceAll());
        }
Exemple #7
0
 /// <summary>
 /// Visits expression term.
 /// </summary>
 /// <param name="term">Expression term.</param>
 public void Visit(VariableTerm term)
 {
     TermStack.Push(Substitution.GetValue(term.NameID));
 }
Exemple #8
0
 /// <summary>
 /// Visits expression term.
 /// </summary>
 /// <param name="term">Expression term.</param>
 public void Visit(ConstantTerm term)
 {
     TermStack.Push(term.NameID);
 }
 public static VARTerm PerformFNC(FNCTerm func, TermStack Parameters)
 {
     throw new NotImplementedException();
 }
Exemple #10
0
        /// <summary>
        /// Visits the given input data node.
        /// </summary>
        /// <param name="data">Input data node.</param>
        public override void Visit(InputData.PDDL.VariableTerm data)
        {
            int variableNameId = IdManager.Variables.GetId(data.Name);

            TermStack.Push(new VariableTerm(variableNameId));
        }
Exemple #11
0
        /// <summary>
        /// Visits the given input data node.
        /// </summary>
        /// <param name="data">Input data node.</param>
        public override void Visit(InputData.PDDL.ConstantTerm data)
        {
            int constantNameId = IdManager.Constants.GetId(data.Name);

            TermStack.Push(new ConstantTerm(constantNameId, IdManager));
        }
            public void getTermFromString(string input, ref TermStack TStack, ref int startPositionPointer)
            {
                //Console.Write("start term {0}, ", input[startPositionPointer]);
                TermTypes    tt;
                TermAbsClass term      = null;
                bool         isOK_Flag = false;
                int          tmp       = startPositionPointer;

                //string txt=TakePieceFromText(input,startPosition,input.Length-startPosition-1);

                if (startPositionPointer < input.Length && OperatorSymbols.Contains(input[startPositionPointer]) && !isOK_Flag)                 //if is operator
                {
                    //Console.WriteLine("operator {0}", input[startPositionPointer]);

                    tt = TermTypes.OPR;
                    startPositionPointer++;
                    if (startPositionPointer < input.Length && OperatorSymbols.Contains(input[startPositionPointer]))
                    {
                        startPositionPointer++;
                    }
                    string txt = TakePieceFromText(input, tmp, startPositionPointer - tmp);
                    term = OPRTerm.GetOperatorTerm(txt);

                    //Console.Write("{0} is done from string ({1}),",OPRTerm.GetOperatorTerm(txt).GetOperatorType, txt);

                    isOK_Flag = true;
                }

                if (startPositionPointer < input.Length && char.IsDigit(input[startPositionPointer]) && !isOK_Flag)                     //if a number
                {
                    int  len     = 0;
                    bool isFloat = false;
                    while (startPositionPointer + len < input.Length && char.IsDigit(input[startPositionPointer + len]))
                    {
                        len++;
                    }
                    if (startPositionPointer + len < input.Length && len > 0 && input[startPositionPointer + len] == '.')
                    {
                        isFloat = true; len++;
                        while (startPositionPointer + len < input.Length && char.IsDigit(input[startPositionPointer + len]))
                        {
                            len++;
                        }
                    }


                    if (isFloat)
                    {
                        NumberFormatInfo provider = new NumberFormatInfo();
                        provider.CurrencyDecimalSeparator = ".";
                        double x = Convert.ToDouble(TakePieceFromText(input, startPositionPointer, len), provider);
                        term = new FLTTerm(x);

                        //Console.Write("FLOAT {0}, ", x);
                    }
                    else
                    {
                        long x = Convert.ToInt64(TakePieceFromText(input, startPositionPointer, len));
                        term = new INTTerm(x);

                        //Console.Write("INTEGER {0}, ", x);
                    }
                    isOK_Flag             = true;
                    startPositionPointer += len;
                }

                if (startPositionPointer < input.Length && char.IsLetter(input[startPositionPointer]) && !isOK_Flag)                    //FNC and VAR starts with letter
                {
                    int len = 1;
                    while (startPositionPointer + len < input.Length && char.IsLetter(input[startPositionPointer + len]))
                    {
                        len++;
                    }
                    if (startPositionPointer + len < input.Length && input[startPositionPointer + len] == '(') //if name is interupted with bracket - it's func
                    {
                        term = new FNCTerm(FNCType.ERROR);                                                     //todo catch function
                    }
                    else
                    {
                        uint[] debugPush = new uint[1];
                        //string txt=TakePieceFromText(input,startPosition,input.Length-startPosition-1);
                        term = new VARTerm(VARType.ERR, debugPush);                             //todo catch variable
                    }
                    startPositionPointer += len;
                    isOK_Flag             = true;
                }

                if (startPositionPointer < input.Length && Markup.Contains(input[startPositionPointer]) && !isOK_Flag)
                {
                    //Console.WriteLine("Markup!!");
                    term      = new MRKTerm(Convert.ToString(input[startPositionPointer++]));
                    isOK_Flag = true;
                }

                if (!isOK_Flag)
                {
                    throw new ParsingException(input[startPositionPointer]);
                }
                TStack.Push(term);
            }
        /// <summary>
        /// 解析器の本体
        /// </summary>
        /// <param name="wc"></param>
        /// <param name="allowKeywordTo">TOキーワードが見つかっても良いか</param>
        /// <param name="endWith">終端記号</param>
        /// <returns></returns>
        private static IOperandTerm reduceTerm(WordCollection wc, bool allowKeywordTo, TermEndWith endWith, VariableCode varCode)
        {
            TermStack stack = new TermStack();
            //int termCount = 0;
            int ternaryCount = 0;
            OperatorCode formerOp = OperatorCode.NULL;
            bool varArg = varCode != VariableCode.__NULL__;
            do
            {
                Word token = wc.Current;
                switch (token.Type)
                {
                    case '\0':
                        goto end;
                    case '"'://LiteralStringWT
                        stack.Add(((LiteralStringWord)token).Str);
                        break;
                    case '0'://LiteralIntegerWT
                        stack.Add(((LiteralIntegerWord)token).Int);
                        break;
                    case 'F'://FormattedStringWT
                        stack.Add(ToStrFormTerm((StrFormWord)token));
                        break;
                    case 'A'://IdentifierWT
                        {
                            string idStr = (((IdentifierWord)token).Code);
                            if (idStr.Equals("TO", Config.SCVariable))
                            {
                                if (allowKeywordTo)
                                    goto end;
                                else
                                    throw new CodeEE("TOキーワードはここでは使用できません");
                            }
                            else if (idStr.Equals("IS", Config.SCVariable))
                                throw new CodeEE("ISキーワードはここでは使用できません");
                            stack.Add(reduceIdentifier(wc, idStr, varCode));
                            continue;
                        }

                    case '='://OperatorWT
                        {
                            if (varArg)
                                throw new CodeEE("変数の引数の読み取り中に予期しない演算子を発見しました");
                            OperatorCode op = ((OperatorWord)token).Code;
                            if (op == OperatorCode.Assignment)
                            {
                                if ((endWith & TermEndWith.Assignment) == TermEndWith.Assignment)
                                    goto end;
                                throw new CodeEE("式中で代入演算子'='が使われています(等価比較には'=='を使用してください)");
                            }

                            if (formerOp == OperatorCode.Equal || formerOp == OperatorCode.Greater || formerOp == OperatorCode.Less
                                || formerOp == OperatorCode.GreaterEqual || formerOp == OperatorCode.LessEqual || formerOp == OperatorCode.NotEqual)
                            {
                                if (op == OperatorCode.Equal || op == OperatorCode.Greater || op == OperatorCode.Less
                                || op == OperatorCode.GreaterEqual || op == OperatorCode.LessEqual || op == OperatorCode.NotEqual)
                                {
                                    ParserMediator.Warn("(構文上の注意)比較演算子が連続しています。", GlobalStatic.Process.GetScaningLine(), 0, false, false);
                                }
                            }
                            stack.Add(op);
                            formerOp = op;
                            if (op == OperatorCode.Ternary_a)
                                ternaryCount++;
                            else if (op == OperatorCode.Ternary_b)
                            {
                                if (ternaryCount > 0)
                                    ternaryCount--;
                                else
                                    throw new CodeEE("対応する'#'のない'?'です");
                            }
                            break;
                        }
                    case '(':
                        wc.ShiftNext();
                        IOperandTerm inTerm = reduceTerm(wc, false, TermEndWith.RightParenthesis, VariableCode.__NULL__);
                        if (inTerm == null)
                            throw new CodeEE("かっこ\"(\"~\")\"の中に式が含まれていません");
                        stack.Add(inTerm);
                        if (wc.Current.Type != ')')
                            throw new CodeEE("対応する')'のない'('です");
                        //termCount++;
                        wc.ShiftNext();
                        continue;
                    case ')':
                        if ((endWith & TermEndWith.RightParenthesis) == TermEndWith.RightParenthesis)
                            goto end;
                        throw new CodeEE("構文解釈中に予期しない記号'" + token.Type + "'を発見しました");
                    case ']':
                        if ((endWith & TermEndWith.RightBracket) == TermEndWith.RightBracket)
                            goto end;
                        throw new CodeEE("構文解釈中に予期しない記号'" + token.Type + "'を発見しました");
                    case ',':
                        if ((endWith & TermEndWith.Comma) == TermEndWith.Comma)
                            goto end;
                        throw new CodeEE("構文解釈中に予期しない記号'" + token.Type + "'を発見しました");
                    case 'M':
                        throw new ExeEE("マクロ解決失敗");
                    default:
                        throw new CodeEE("構文解釈中に予期しない記号'" + token.Type + "'を発見しました");
                }
                //termCount++;
                wc.ShiftNext();
            } while (!varArg);
            end:
            if (ternaryCount > 0)
                throw new CodeEE("\'?\'と\'#\'の数が正しく対応していません");
            return stack.ReduceAll();
        }
Exemple #14
0
        public static void PerformOperatorComputation(OPRTerm oper, TermStack TStack)
        {
            unchecked
            {
                switch (oper.GetOperatorType)
                {
                case OPRType.EQUAL:
                    TermAbsClass B = TStack.Pop();
                    TermAbsClass A = TStack.Pop();
                    if (A.GetTermType == TermTypes.INT || A.GetTermType == TermTypes.FLT)                       //A is now totally B
                    {
                        TStack.Push(B);
                    }
                    if (A.GetTermType == TermTypes.VAR)                 //A is now variable with B value (can be variable, that contains variable)
                    {
                        VARTerm tmp;                                    //(VARType)B.GetBitValue[0] gets variable type
                        if (B.GetTermType == TermTypes.INT)
                        {
                            tmp = new VARTerm(VARType.INT, B.GetBitValue);
                        }
                        else
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            tmp = new VARTerm(VARType.FLT, B.GetBitValue);
                        }
                        else
                        {
                            throw new NotImplementedException();
                        }
                        TStack.Push(tmp);
                    }
                    break;

                case OPRType.PLUS:
                    B = TStack.Pop();
                    A = TStack.Pop();
                    if (A.GetTermType == TermTypes.INT)
                    {
                        long a = BytesToINT(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(a + b));
                            //Console.WriteLine("{0} is internal",TStack.Pop().debug_GetValueAsString());
                            //TStack.Push(new INTTerm(a+b));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new FLTTerm(a + b));
                        }
                        if (B.GetTermType == TermTypes.VAR)
                        {
                            throw new NotImplementedException();
                        }
                    }
                    if (A.GetTermType == TermTypes.FLT)
                    {
                        double a = BytesToDBL(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new FLTTerm(a + b));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new FLTTerm(a + b));
                        }
                        if (B.GetTermType == TermTypes.VAR)
                        {
                            throw new NotImplementedException();
                        }
                    }
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        throw new NotImplementedException();
                    }
                    break;

                case OPRType.MINUS:
                    B = TStack.Pop();                                   //wtf(0_o)
                    A = TStack.Pop();
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        A = GetObjectFromVAR(A);
                    }
                    if (B.GetTermType == TermTypes.VAR)
                    {
                        B = GetObjectFromVAR(B);
                    }

                    if (A.GetTermType == TermTypes.INT)
                    {
                        long a = BytesToINT(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(a - b));
                            //Console.WriteLine("{0} is internal",TStack.Pop().debug_GetValueAsString());
                            //TStack.Push(new INTTerm(a+b));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new FLTTerm(a - b));
                        }
                        if (B.GetTermType == TermTypes.VAR)
                        {
                            throw new NotImplementedException();
                        }
                    }
                    if (A.GetTermType == TermTypes.FLT)
                    {
                        double a = BytesToDBL(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new FLTTerm(a - b));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new FLTTerm(a - b));
                        }
                        if (B.GetTermType == TermTypes.VAR)
                        {
                            throw new NotImplementedException();
                        }
                    }
                    break;

                case OPRType.MULT:
                    B = TStack.Pop();
                    A = TStack.Pop();
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        A = GetObjectFromVAR(A);
                    }
                    if (B.GetTermType == TermTypes.VAR)
                    {
                        B = GetObjectFromVAR(B);
                    }

                    if (A.GetTermType == TermTypes.INT)
                    {
                        long a = BytesToINT(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(a * b));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new FLTTerm(a * b));
                        }
                    }
                    if (A.GetTermType == TermTypes.FLT)
                    {
                        double a = BytesToDBL(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new FLTTerm(a * b));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new FLTTerm(a * b));
                        }
                    }
                    break;

                case OPRType.DIV:
                    B = TStack.Pop();
                    A = TStack.Pop();
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        A = GetObjectFromVAR(A);
                    }
                    if (B.GetTermType == TermTypes.VAR)
                    {
                        B = GetObjectFromVAR(B);
                    }

                    if (A.GetTermType == TermTypes.INT)
                    {
                        long a = BytesToINT(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(a / b));
                            //Console.WriteLine("{0} is internal",TStack.Pop().debug_GetValueAsString());
                            //TStack.Push(new INTTerm(a+b));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new FLTTerm(a / b));
                        }
                    }
                    if (A.GetTermType == TermTypes.FLT)
                    {
                        double a = BytesToDBL(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new FLTTerm(a / b));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new FLTTerm(a / b));
                        }
                        if (B.GetTermType == TermTypes.VAR)
                        {
                            throw new NotImplementedException();
                        }
                    }
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        throw new NotImplementedException();
                    }
                    break;

                case OPRType.PERCENT:
                    B = TStack.Pop();
                    A = TStack.Pop();
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        A = GetObjectFromVAR(A);
                    }
                    if (B.GetTermType == TermTypes.VAR)
                    {
                        B = GetObjectFromVAR(B);
                    }

                    if (A.GetTermType == TermTypes.INT)
                    {
                        long a = BytesToINT(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(a % b));
                            //Console.WriteLine("{0} is internal",TStack.Pop().debug_GetValueAsString());
                            //TStack.Push(new INTTerm(a+b));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new FLTTerm(a % (long)b));
                        }
                    }
                    if (A.GetTermType == TermTypes.FLT)
                    {
                        double a = BytesToDBL(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new FLTTerm((long)a / b));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new FLTTerm((long)a / (long)b));
                        }
                    }
                    break;

                case OPRType.LESS:
                    B = TStack.Pop();
                    A = TStack.Pop();
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        A = GetObjectFromVAR(A);
                    }
                    if (B.GetTermType == TermTypes.VAR)
                    {
                        B = GetObjectFromVAR(B);
                    }

                    if (A.GetTermType == TermTypes.INT)
                    {
                        long a = BytesToINT(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(LogicNumber(a < b)));
                            //Console.WriteLine("{0} is internal",TStack.Pop().debug_GetValueAsString());
                            //TStack.Push(new INTTerm(a+b));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new INTTerm(LogicNumber(a < b)));
                        }
                    }
                    if (A.GetTermType == TermTypes.FLT)
                    {
                        double a = BytesToDBL(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(LogicNumber(a < b)));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new INTTerm(LogicNumber(a < b)));
                        }
                    }
                    break;

                case OPRType.MORE:
                    B = TStack.Pop();
                    A = TStack.Pop();
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        A = GetObjectFromVAR(A);
                    }
                    if (B.GetTermType == TermTypes.VAR)
                    {
                        B = GetObjectFromVAR(B);
                    }

                    if (A.GetTermType == TermTypes.INT)
                    {
                        long a = BytesToINT(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(LogicNumber(a > b)));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new INTTerm(LogicNumber(a > b)));
                        }
                    }
                    if (A.GetTermType == TermTypes.FLT)
                    {
                        double a = BytesToDBL(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(LogicNumber(a > b)));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new INTTerm(LogicNumber(a > b)));
                        }
                    }
                    break;

                case OPRType.EXL_MRK:                   //NOT
                    A = TStack.Pop();
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        A = GetObjectFromVAR(A);
                    }

                    if (A.GetTermType == TermTypes.INT)
                    {
                        long a = BytesToINT(A.GetBitValue);
                        if (a > 0)
                        {
                            TStack.Push(new INTTerm(0));
                        }
                        else
                        {
                            TStack.Push(new INTTerm(1));
                        }
                    }
                    if (A.GetTermType == TermTypes.FLT)
                    {
                        double a     = BytesToDBL(A.GetBitValue);
                        int    round = (int)(a + flt_round_tolerancy);
                        if (round > 0)
                        {
                            TStack.Push(new INTTerm(0));
                        }
                        else
                        {
                            TStack.Push(new INTTerm(1));
                        }
                    }
                    break;

                case OPRType.AMPERSANT:                 //boolean and
                    B = TStack.Pop();
                    A = TStack.Pop();
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        A = GetObjectFromVAR(A);
                    }
                    if (B.GetTermType == TermTypes.VAR)
                    {
                        B = GetObjectFromVAR(B);
                    }

                    if (A.GetTermType == TermTypes.INT)
                    {
                        long a = BytesToINT(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(TransformToPseudoBool(a) & TransformToPseudoBool(b)));                                      //a and b are "booleans"
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new INTTerm(TransformToPseudoBool(a) & TransformToPseudoBool((long)(b + flt_round_tolerancy))));
                        }
                    }
                    if (A.GetTermType == TermTypes.FLT)
                    {
                        double a   = BytesToDBL(A.GetBitValue);
                        long   tmp = (long)(a + flt_round_tolerancy);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(TransformToPseudoBool(tmp) & TransformToPseudoBool(b)));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b    = BytesToDBL(B.GetBitValue);
                            long   tmp1 = (long)(b + flt_round_tolerancy);
                            TStack.Push(new INTTerm(TransformToPseudoBool(tmp) & TransformToPseudoBool(tmp1)));
                        }
                    }
                    break;

                case OPRType.VERT_BAR:                  //OR
                    B = TStack.Pop();
                    A = TStack.Pop();
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        A = GetObjectFromVAR(A);
                    }
                    if (B.GetTermType == TermTypes.VAR)
                    {
                        B = GetObjectFromVAR(B);
                    }

                    if (A.GetTermType == TermTypes.INT)
                    {
                        long a = BytesToINT(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(TransformToPseudoBool(a) | TransformToPseudoBool(b)));                                      //a and b are "booleans"
                            //Console.WriteLine("{0} is internal",TStack.Pop().debug_GetValueAsString());
                            //TStack.Push(new INTTerm(a+b));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new INTTerm(TransformToPseudoBool(a) | TransformToPseudoBool((long)(b + flt_round_tolerancy))));
                        }
                    }
                    if (A.GetTermType == TermTypes.FLT)
                    {
                        double a   = BytesToDBL(A.GetBitValue);
                        long   tmp = (long)(a + flt_round_tolerancy);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(TransformToPseudoBool(tmp) | TransformToPseudoBool(b)));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b    = BytesToDBL(B.GetBitValue);
                            long   tmp1 = (long)(b + flt_round_tolerancy);
                            TStack.Push(new INTTerm(TransformToPseudoBool(tmp) | TransformToPseudoBool(tmp1)));
                        }
                    }
                    break;

                case OPRType.DBL_AMPERSANT:                     //bitwise AND
                    B = TStack.Pop();
                    A = TStack.Pop();
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        A = GetObjectFromVAR(A);
                    }
                    if (B.GetTermType == TermTypes.VAR)
                    {
                        B = GetObjectFromVAR(B);
                    }

                    if (A.GetTermType == TermTypes.INT)
                    {
                        long a = BytesToINT(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(a & b));                                    //a and b are "booleans"
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new INTTerm(a & (long)(b + flt_round_tolerancy)));
                        }
                    }
                    if (A.GetTermType == TermTypes.FLT)
                    {
                        double a   = BytesToDBL(A.GetBitValue);
                        long   tmp = (long)(a + flt_round_tolerancy);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(tmp & b));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b    = BytesToDBL(B.GetBitValue);
                            long   tmp1 = (long)(b + flt_round_tolerancy);
                            TStack.Push(new INTTerm(tmp & tmp1));
                        }
                    }
                    break;

                case OPRType.DBL_VERT_BAR:                      //bitwise OR
                    B = TStack.Pop();
                    A = TStack.Pop();
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        A = GetObjectFromVAR(A);
                    }
                    if (B.GetTermType == TermTypes.VAR)
                    {
                        B = GetObjectFromVAR(B);
                    }

                    if (A.GetTermType == TermTypes.INT)
                    {
                        long a = BytesToINT(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(a | b));                                    //a and b are "booleans"
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new INTTerm(a | (long)(b + flt_round_tolerancy)));
                        }
                    }
                    if (A.GetTermType == TermTypes.FLT)
                    {
                        double a   = BytesToDBL(A.GetBitValue);
                        long   tmp = (long)(a + flt_round_tolerancy);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(tmp | b));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b    = BytesToDBL(B.GetBitValue);
                            long   tmp1 = (long)(b + flt_round_tolerancy);
                            TStack.Push(new INTTerm(tmp | tmp1));
                        }
                    }
                    break;

                case OPRType.DBL_EXL_MRK:                       //bitwise NOT
                    A = TStack.Pop();
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        A = GetObjectFromVAR(A);
                    }

                    if (A.GetTermType == TermTypes.INT)
                    {
                        long a = BytesToINT(A.GetBitValue);
                        TStack.Push(new INTTerm(~a));                                   //~ is inversion
                    }
                    if (A.GetTermType == TermTypes.FLT)
                    {
                        double a   = BytesToDBL(A.GetBitValue);
                        long   tmp = (long)(a + flt_round_tolerancy);
                        TStack.Push(new INTTerm(~tmp));
                    }
                    break;

                case OPRType.INCREMENT:
                    A = TStack.Pop();
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        A = GetObjectFromVAR(A);
                    }

                    if (A.GetTermType == TermTypes.INT)
                    {
                        long a = BytesToINT(A.GetBitValue);
                        TStack.Push(new INTTerm(++a));                                  //~ is inversion
                    }
                    if (A.GetTermType == TermTypes.FLT)
                    {
                        double a = BytesToDBL(A.GetBitValue);
                        TStack.Push(new FLTTerm(a + flt_round_tolerancy));
                    }
                    break;

                case OPRType.DECREMENT:
                    A = TStack.Pop();
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        A = GetObjectFromVAR(A);
                    }

                    if (A.GetTermType == TermTypes.INT)
                    {
                        long a = BytesToINT(A.GetBitValue);
                        TStack.Push(new INTTerm(--a));                                  //~ is inversion
                    }
                    if (A.GetTermType == TermTypes.FLT)
                    {
                        double a = BytesToDBL(A.GetBitValue);
                        TStack.Push(new FLTTerm(a - flt_round_tolerancy));
                    }
                    break;

                case OPRType.DBL_EQUAL:
                    B = TStack.Pop();
                    A = TStack.Pop();
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        A = GetObjectFromVAR(A);
                    }
                    if (B.GetTermType == TermTypes.VAR)
                    {
                        B = GetObjectFromVAR(B);
                    }

                    if (A.GetTermType == TermTypes.INT)
                    {
                        long a = BytesToINT(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(LogicNumber(a == b)));                                      //a and b are "booleans"
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new INTTerm(LogicNumber(a > (b - flt_round_tolerancy) || a < (b + flt_round_tolerancy))));
                        }
                    }
                    if (A.GetTermType == TermTypes.FLT)
                    {
                        double a = BytesToDBL(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(LogicNumber(b > (a - flt_round_tolerancy) || b < (a + flt_round_tolerancy))));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b    = BytesToDBL(B.GetBitValue);
                            long   tmp1 = (long)(b + flt_round_tolerancy);
                            TStack.Push(new INTTerm(LogicNumber(a == b)));
                        }
                    }
                    break;

                case OPRType.LEFT_SHIFT:
                    B = TStack.Pop();
                    A = TStack.Pop();
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        A = GetObjectFromVAR(A);
                    }
                    if (B.GetTermType == TermTypes.VAR)
                    {
                        B = GetObjectFromVAR(B);
                    }

                    if (A.GetTermType == TermTypes.INT)
                    {
                        long a = BytesToINT(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue) % 64;
                            TStack.Push(new INTTerm(a << (int)b));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new INTTerm(a << (int)(b + flt_round_tolerancy) % 64));
                        }
                    }
                    if (A.GetTermType == TermTypes.FLT)
                    {
                        double a   = BytesToDBL(A.GetBitValue);
                        long   tmp = (long)(a + flt_round_tolerancy);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(tmp << (int)(b % 64)));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b    = BytesToDBL(B.GetBitValue);
                            long   tmp1 = (long)(b + flt_round_tolerancy) % 64;
                            TStack.Push(new INTTerm(tmp << (int)tmp1));
                        }
                    }
                    break;

                case OPRType.RIGHT_SHIFT:
                    B = TStack.Pop();
                    A = TStack.Pop();
                    if (A.GetTermType == TermTypes.VAR)
                    {
                        A = GetObjectFromVAR(A);
                    }
                    if (B.GetTermType == TermTypes.VAR)
                    {
                        B = GetObjectFromVAR(B);
                    }

                    if (A.GetTermType == TermTypes.INT)
                    {
                        long a = BytesToINT(A.GetBitValue);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue) % 64;
                            TStack.Push(new INTTerm(a >> (int)b));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b = BytesToDBL(B.GetBitValue);
                            TStack.Push(new INTTerm(a >> (int)(b + flt_round_tolerancy) % 64));
                        }
                    }
                    if (A.GetTermType == TermTypes.FLT)
                    {
                        double a   = BytesToDBL(A.GetBitValue);
                        long   tmp = (long)(a + flt_round_tolerancy);
                        if (B.GetTermType == TermTypes.INT)
                        {
                            long b = BytesToINT(B.GetBitValue);
                            TStack.Push(new INTTerm(tmp >> (int)(b % 64)));
                        }
                        if (B.GetTermType == TermTypes.FLT)
                        {
                            double b    = BytesToDBL(B.GetBitValue);
                            long   tmp1 = (long)(b + flt_round_tolerancy) % 64;
                            TStack.Push(new INTTerm(tmp >> (int)tmp1));
                        }
                    }
                    break;
                }
            }
        }