/// <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)); }
/// <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()); }
/// <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()); }
/// <summary> /// Visits expression term. /// </summary> /// <param name="term">Expression term.</param> public void Visit(VariableTerm term) { TermStack.Push(Substitution.GetValue(term.NameID)); }
/// <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(); }
/// <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)); }
/// <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(); }
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; } } }