Пример #1
0
        public override void Eval(ref IValue ret, IValue[] a_pArg)
        {
            ParserXBase parser = GetParent();

            Console.WriteLine("\nParser functions:");
            Console.WriteLine("-----------------\n");

            var funcs = parser.GetFunDef();

            if (funcs.Count == 0)
            {
                Console.WriteLine("No functions defined\n");
            }
            else
            {
                foreach (var item in funcs)
                {
                    var v = (ICallback)item.Value;
                    if (v.GetDesc() == "")
                    {
                        continue;
                    }
                    Console.WriteLine($"  {v.GetDesc()}");
                }
            }

            ret = funcs.Count;
        }
Пример #2
0
        public void AddToParser(ParserXBase pParser)
        {
            pParser.DefineConst("i", new Complex(0.0, 1.0));

            pParser.AddValueReader(new CmplxValReader());

            // Complex valued functions
            pParser.DefineFun(new FunCmplxReal());
            pParser.DefineFun(new FunCmplxImag());
            pParser.DefineFun(new FunCmplxConj());
            pParser.DefineFun(new FunCmplxArg());
            pParser.DefineFun(new FunCmplxNorm());
            pParser.DefineFun(new FunCmplxSin());
            pParser.DefineFun(new FunCmplxCos());
            pParser.DefineFun(new FunCmplxTan());
            pParser.DefineFun(new FunCmplxSinH());
            pParser.DefineFun(new FunCmplxCosH());
            pParser.DefineFun(new FunCmplxTanH());
            pParser.DefineFun(new FunCmplxSqrt());
            pParser.DefineFun(new FunCmplxExp());
            pParser.DefineFun(new FunCmplxLn());
            pParser.DefineFun(new FunCmplxLog());
            pParser.DefineFun(new FunCmplxLog2());
            pParser.DefineFun(new FunCmplxLog10());
            pParser.DefineFun(new FunCmplxAbs());
            pParser.DefineFun(new FunCmplxPow());

            // Complex valued operators
            pParser.DefineOprt(new OprtAddCmplx());
            pParser.DefineOprt(new OprtSubCmplx());
            pParser.DefineOprt(new OprtMulCmplx());
            pParser.DefineOprt(new OprtDivCmplx());
            pParser.DefineOprt(new OprtPowCmplx());
            pParser.DefineInfixOprt(new OprtSignCmplx());
        }
Пример #3
0
        public override void Eval(ref IValue ret, IValue[] a_pArg)
        {
            ParserXBase parser = GetParent();

            parser.EnableOptimizer(a_pArg[0].GetBool());
            ret = a_pArg[0].GetBool();
        }
Пример #4
0
        public override void Eval(ref IValue ret, IValue[] a_pArg)
        {
            ParserXBase parser = GetParent();

            Console.WriteLine("\nParser variables:");
            Console.WriteLine("-----------------\n");

            var vars = parser.GetVar();

            if (vars.Count == 0)
            {
                Console.WriteLine("Expression does not contain variables\n");
            }
            else
            {
                foreach (var item in vars)
                {
                    var v = (Variable)item.Value;
                    Console.Write($"  {item.Key} = {item.Value}");
                    Console.WriteLine($"  (type=\"{v.GetValueType()}\"; ptr=0x{v.MemoryAddress()})");
                }
            }

            ret = vars.Count;
        }
Пример #5
0
        public override void Eval(ref IValue ret, IValue[] a_pArg)
        {
            ParserXBase.EnableDebugDump(false, false);
            var pt = new ParserTester();

            pt.Run();
            ret = 0;
        }
Пример #6
0
 public void AddToParser(ParserXBase pParser)
 {
     pParser.DefinePostfixOprt(new OprtNano());
     pParser.DefinePostfixOprt(new OprtMicro());
     pParser.DefinePostfixOprt(new OprtMilli());
     pParser.DefinePostfixOprt(new OprtKilo());
     pParser.DefinePostfixOprt(new OprtMega());
     pParser.DefinePostfixOprt(new OprtGiga());
 }
Пример #7
0
        public override void Eval(ref IValue ret, IValue[] a_pArg)
        {
            bool bo = a_pArg[0].GetBool();
            bool so = a_pArg[1].GetBool();

            Console.WriteLine($"Bytecode output {(bo ? "de" : "")}activated.");
            Console.WriteLine($"Stack output {(so ? "de" : "")}activated.");
            ParserXBase.EnableDebugDump(so, bo);
            ret = 0;
        }
Пример #8
0
        public void AddToParser(ParserXBase pParser)
        {
            // Matrix functions
            pParser.DefineFun(new FunMatrixOnes());
            pParser.DefineFun(new FunMatrixZeros());
            pParser.DefineFun(new FunMatrixEye());
            pParser.DefineFun(new FunMatrixSize());

            // Matrix Operators
            pParser.DefinePostfixOprt(new OprtTranspose());

            // Colon operator
            pParser.DefineOprt(new OprtColon());
            //pParser->DefineAggregator(new AggColon());
        }
Пример #9
0
        public void AddToParser(ParserXBase parser)
        {
            parser.AddValueReader(new StrValReader());
            parser.AddValueReader(new CharacterReader());

            // Functions
            parser.DefineFun(new FunStrLen());
            parser.DefineFun(new FunStrToDbl());
            parser.DefineFun(new FunStrToUpper());
            parser.DefineFun(new FunStrToLower());
            parser.DefineFun(new FunStrSplit());
            parser.DefineFun(new FunStrJoin());

            // Operators
            parser.DefineOprt(new OprtStrAdd());
        }
Пример #10
0
        public void AddToParser(ParserXBase pParser)
        {
            pParser.AddValueReader(new NumericReader());

            pParser.DefineFun(new FunSin());
            pParser.DefineFun(new FunCos());
            pParser.DefineFun(new FunTan());
            pParser.DefineFun(new FunSinH());
            pParser.DefineFun(new FunCosH());
            pParser.DefineFun(new FunTanH());
            pParser.DefineFun(new FunASin());
            pParser.DefineFun(new FunACos());
            pParser.DefineFun(new FunATan());
            pParser.DefineFun(new FunASinH());
            pParser.DefineFun(new FunACosH());
            pParser.DefineFun(new FunATanH());
            pParser.DefineFun(new FunLog());
            pParser.DefineFun(new FunLog10());
            pParser.DefineFun(new FunLog2());
            pParser.DefineFun(new FunLn());
            pParser.DefineFun(new FunExp());
            pParser.DefineFun(new FunSqrt());
            pParser.DefineFun(new FunCbrt());
            pParser.DefineFun(new FunAbs());

            // binary functions
            pParser.DefineFun(new FunPow());
            pParser.DefineFun(new FunHypot());
            pParser.DefineFun(new FunAtan2());
            pParser.DefineFun(new FunFmod());
            pParser.DefineFun(new FunRemainder());

            // Operator callbacks
            pParser.DefineInfixOprt(new OprtSign());
            pParser.DefineInfixOprt(new OprtSignPos());
            pParser.DefineOprt(new OprtAdd());
            pParser.DefineOprt(new OprtSub());
            pParser.DefineOprt(new OprtMul());
            pParser.DefineOprt(new OprtDiv());
            pParser.DefineOprt(new OprtPow());
        }
Пример #11
0
            static void DrawSplash()
            {
                Console.WriteLine(@"
##################################################################
#                ____                          _  _              #
#               |  __ \                      _| || |_            #
#          _   _| |__) |_ _ _ _ ________ _ _|_  __  _|           #
#         | | | |  ___/ _` | '__|_  / _ \ '__|| || |_            #
#         | |_| | |  | (_| | |   / /  __/ | |_  __  _|           #
#         | ._,_|_|   \__,_|_|  /___\___|_|   |_||_|             #
#         | |                                                    #
#         |_|                                                    #
#                                                                #
##################################################################
");
                Console.Write($"Welcome to μParzer#.\n\t(c) John Cleary, {ParserXBase.GetVersion()}\n");
#if DEBUG
                Console.WriteLine("\tDEBUG Build");
#else
                Console.WriteLine();
#endif
            }
Пример #12
0
        public override void Eval(ref IValue ret, IValue[] a_pArg)
        {
            ParserXBase parser = GetParent();

            Console.WriteLine("\nParser constants:");
            Console.WriteLine("-----------------\n");

            var consts = parser.GetConst();

            if (consts.Count == 0)
            {
                Console.WriteLine("No constants defined\n");
            }
            else
            {
                foreach (var item in consts)
                {
                    var v = (Value)item.Value;
                    Console.WriteLine($"  {item.Key} = {item.Value}");
                }
            }

            ret = consts.Count;
        }
Пример #13
0
        public override void Eval(ref IValue ret, IValue[] a_pArg)
        {
            string sVer = "muParser# V" + ParserXBase.GetVersion();

            ret = sVer;
        }
Пример #14
0
        public void AddToParser(ParserXBase pParser)
        {
            // Readers that need fancy decorations on their values must
            // be added first (i.e. hex . "0x...") Otherwise the
            // zero in 0x will be read as a value of zero!
            pParser.AddValueReader(new HexValReader());
            pParser.AddValueReader(new BinValReader());
            pParser.AddValueReader(new BoolValReader());

            // Constants
            pParser.DefineConst("pi", Math.PI);
            pParser.DefineConst("e", Math.E);

            // Vector
            pParser.DefineFun(new FunSizeOf());

            // Generic functions
            pParser.DefineFun(new FunMax());
            pParser.DefineFun(new FunMin());
            pParser.DefineFun(new FunSum());

            // misc
            pParser.DefineFun(new FunParserID());

            // integer package
            pParser.DefineOprt(new OprtLAnd());
            pParser.DefineOprt(new OprtLOr());
            pParser.DefineOprt(new OprtAnd());
            pParser.DefineOprt(new OprtOr());
            pParser.DefineOprt(new OprtShr());
            pParser.DefineOprt(new OprtShl());

            // booloean package
            pParser.DefineOprt(new OprtLE());
            pParser.DefineOprt(new OprtGE());
            pParser.DefineOprt(new OprtLT());
            pParser.DefineOprt(new OprtGT());
            pParser.DefineOprt(new OprtEQ());
            pParser.DefineOprt(new OprtNEQ());
            pParser.DefineOprt(new OprtLAnd("and"));  // add logic and with a different identifier
            pParser.DefineOprt(new OprtLOr("or"));    // add logic and with a different identifier
                                                      //  pParser.DefineOprt(new OprtBXor());

            // assignement operators
            pParser.DefineOprt(new OprtAssign());
            pParser.DefineOprt(new OprtAssignAdd());
            pParser.DefineOprt(new OprtAssignSub());
            pParser.DefineOprt(new OprtAssignMul());
            pParser.DefineOprt(new OprtAssignDiv());

            // infix operators
            pParser.DefineInfixOprt(new OprtCastToFloat());
            pParser.DefineInfixOprt(new OprtCastToInt());
            pParser.DefineInfixOprt(new OprtCastToChar());

            // postfix operators
            pParser.DefinePostfixOprt(new OprtFact());
            // <ibg 20130708> commented: "%" is a reserved sign for either the
            //                modulo operator or comment lines.
            pParser.DefinePostfixOprt(new OprtPercentage());
            // </ibg>
        }
Пример #15
0
        public override void Eval(ref IValue ret, IValue[] a_pArg)
        {
            // Debug.Assert(a_pArg.Length <= 1);
            StreamWriter pFile     = null;
            bool         logToFile = false;

            int iCount = 400000;

            if (a_pArg.Length > 0)
            {
                if (a_pArg[0].IsInteger())
                {
                    iCount = (int)a_pArg[0].GetInteger();
                }
                else
                {
                    logToFile = a_pArg[0].GetBool();
                }
            }

            string[] sExpr =
            {
                "sin(a)",                                                                                                                             "cos(a)",                                                                                                                                                                                                                                     "tan(a)",                      "sqrt(a)",          "(a+b)*3",       "a^2+b^2",   "a^3+b^3",                "a^4+b^4",
                "a^5+b^5",                                                                                                                            "a*2.43854357347+b*2.43854357347",                                                                                                                                                                                                            "-(b^1.1)",                    "a + b * c",        "a * b + c",     "a+b*(a+b)", "(1+b)*(-3.43854357347)",
                "e^log(7.43854357347*a)",                                                                                                             "10^log(3+b)",                                                                                                                                                                                                                                "a+b-e*pi/5^6",                "a^b/e*pi-5+6",     "sin(a)+sin(b)",
                "(cos(2.41)/b)",                                                                                                                      "-(sin(pi+a)+1.43854357347)",                                                                                                                                                                                                                 "a-(e^(log(7+b)))",            "sin(((a-a)+b)+a)",
                "((0.09/a)+2.58)-1.67",                                                                                                               "abs(sin(sqrt(a^2+b^2))*255)",                                                                                                                                                                                                                "abs(sin(sqrt(a*a+b*b))*255)",
                "cos(0.90-((cos(b)/2.89)/e)/a)",                                                                                                      "(1*(2*(3*(4*(5*(6*(a+b)))))))",
                "abs(sin(sqrt(a^2.1+b^2.1))*255)",                                                                                                    "(1.43854357347*(2.43854357347*(3.43854357347*(4.43854357347*(5.43854357347*(6.43854357347*(7.43854357347*(a+b))))))))",
                "1.43854357347/(a*sqrt(2.43854357347*pi))*e^(-0.543854357347*((b-a)/a)^2.43854357347)",                                               "1.43854357347+2.43854357347-3.43854357347*4.43854357347/5.43854357347^6.43854357347*(2.43854357347*(1.43854357347-5.43854357347+(3.43854357347*7.43854357347^9.43854357347)*(4.43854357347+6.43854357347*7.43854357347-3.43854357347)))+12",
                "1+b-3*4.0/5.43854357347^6*(2*(1.43854357347-5.43854357347+(3.43854357347*7.43854357347^9.43854357347)*(4+6*7-3)))+12.43854357347*a",
                "(b+1)*(b+2)*(b+3)*(b+4)*(b+5)*(b+6)*(b+7)*(b+8)*(b+9)*(b+10)*(b+11)*(b+12)",
                "(a/((((b+(((e*(((((pi*((((3.43854357347*((pi+a)+pi))+b)+b)*a))+0.43854357347)+e)+a)/a))+a)+b))+b)*a)-pi))",
                "(((-9.43854357347))-e/(((((((pi-(((-7.43854357347)+(-3.1238723947329)/4.43897589288/e))))/(((-5.43854357347))-2.43854357347)-((pi+(-0))*(sqrt((e+e))*(-8.43854357347))*(((-pi)+(-pi)-(-9.43854357347)*(6.43854357347*5.43854357347))/(-e)-e))/2.43854357347)/((((sqrt(2.43854357347/(-e)+6.43854357347)-(4.43854357347-2.43854357347))+((5.43854357347/(-2.43854357347))/(1*(-pi)+3.43854357347))/8.43854357347)*pi*((pi/((-2.43854357347)/(-6.43854357347)*1.43854357347*(-1.43854357347))*(-6.43854357347)+(-e)))))/((e+(-2.43854357347)+(-e)*((((-3.43854357347)*9.43854357347+(-e)))+(-9)))))))-((((e-7.43854357347+(((5.43854357347/pi-(3.43854357347/1.43854357347+pi)))))/e)/(-5))/(sqrt((((((1+(-7))))+((((-e)*(-e)))-8.43854357347))*(-5.43854357347)/((-e)))*(-6.43854357347)-((((((-2.43854357347)-(-9.43854357347)-(-e)-1)/3))))/(sqrt((8.43854357347+(e-((-6.43854357347))+(9.43854357347*(-9.43854357347))))*(((3.43854357347+2.43854357347-8.43854357347))*(7.43854357347+6.43854357347+(-5.43854357347))+((0/(-e)*(-pi))+7)))+(((((-e)/e/e)+((-6)*5)*e+(3+(-5)/pi))))+pi))/sqrt((((9.43854357347))+((((pi))-8.43854357347+2.43854357347))+pi))/e*4.43854357347)*((-5.43854357347)/(((-pi))*(sqrt(e)))))-(((((((-e)*(e)-pi))/4.43854357347+(pi)*(-9.43854357347)))))))+(-pi)"
            };

#if DEBUG
            var outstr = $"{Directory.GetCurrentDirectory()}/Result_{DateTime.Now.ToString(CultureInfo.InvariantCulture).Replace(':', '-').Replace(' ', '-').Replace('/', '-')}_debug.txt";
#else
            var outstr = $"{Directory.GetCurrentDirectory()}/Result_{DateTime.Now.ToString(CultureInfo.InvariantCulture).Replace(':', '-').Replace(' ', '-').Replace('/', '-')}_release.txt";
#endif
            var   parser = new ParserX(EPackages.pckALL_NON_COMPLEX);
            Value a      = new Value(1.0);
            Value b      = new Value(2.0);
            Value c      = new Value(3.0);

            parser.DefineVar("a", new Variable(a));
            parser.DefineVar("b", new Variable(b));
            parser.DefineVar("c", new Variable(c));
            // parser.DefineConst("pi", 3.14159265);
            // parser.DefineConst("e", 2.718281828459);

            var timer = new Timer();

#if DEBUG
            string sMode = "# debug mode\n";
#else
            string sMode = "# release mode\n";
#endif
            if (logToFile)
            {
                pFile = new StreamWriter(outstr);
                pFile.Write("{0}; muParserX V{1}\n", sMode, ParserXBase.GetVersion());
                pFile.Write("\"Eqn no.\", \"number\", \"result\", \"time in ms\", \"eval per second\", \"expr\"\n");
            }

            Console.Write(sMode);
            Console.Write("\"Eqn no.\", \"number\", \"result\", \"time in ms\", \"eval per second\", \"expr\"\n");



            double avgEvalPerSec = 0;
            int    ct            = 0;
            for (int i = 0; i < sExpr.Length; ++i)
            {
                ct++;
                timer.Start();
                IValue value = 0;
                parser.SetExpr(sExpr[i]);

                // implicitely create reverse polish notation
                parser.Eval();

                for (int n = 0; n < iCount; ++n)
                {
                    value = parser.Eval();
                }
                timer.Stop();
                double diff = (double)timer.Duration(iCount);

                double evalPerSec = iCount * 1000.0 / diff;
                avgEvalPerSec += evalPerSec;
                if (logToFile)
                {
                    pFile.Write("Eqn_{0}, {1:n}, {2,-5:n}, {3,-10:n}, {4,-10:n}, {5}\n", i, iCount, value.AsFloat(), diff, evalPerSec, sExpr[i]);
                }
                Console.Write("Eqn_{0}, {1:n}, {2,-5:n}, {3,-10:n}, {4,-10:n}, {5}\n", i, iCount, value.AsFloat(), diff, evalPerSec, sExpr[i]);
            }

            avgEvalPerSec /= ct;

            if (logToFile)
            {
                pFile.Write("# Eval per s: {0}", (long)avgEvalPerSec);
            }
            Console.WriteLine("# Eval per s: {0}", (long)avgEvalPerSec);
            if (logToFile)
            {
                pFile.Flush();
                pFile.Close();
            }

            ret = avgEvalPerSec;
        }
Пример #16
0
        //------------------------------------------------------------------------------

        /*  Assign a parser object to the callback.
         *  \param a_pParent The parser that belongs to this callback object.
         *
         * The parent object can be used in order to access internals of the parser
         * from within a callback object. Thus enabling callbacks to delete
         * variables or functions if this is desired.
         */
        internal void SetParent(ParserXBase a_pParent)
        {
            Global.MUP_VERIFY(a_pParent != null);
            m_pParent = a_pParent;
        }
Пример #17
0
            private static void Initialise(ParserX parser)
            {
                // Create an array variable
                Value arr1 = new Value(3, 0);

                arr1[0] = (1.0);
                arr1[1] = 2.0;
                arr1[2] = 3.0;

                Value arr2 = new Value(3, 0);

                arr2[0] = 4.0;
                arr2[1] = 3.0;
                arr2[2] = 2.0;

                Value arr3 = new Value(4, 0);

                arr3[0] = 1.0;
                arr3[1] = 2.0;
                arr3[2] = 3.0;
                arr3[3] = 4.0;

                Value arr4 = new Value(3, 0);

                arr4[0] = 4.0;
                arr4[1] = false;
                arr4[2] = "hallo";

                // Create a 3x3 matrix with zero elements
                Value m1 = new Value(3, 3, 0);

                m1[0, 0] = 1.0;
                m1[1, 1] = 1.0;
                m1[2, 2] = 1.0;

                Value m2 = new Value(3, 3, 0);

                m2[0, 0] = 1.0;
                m2[0, 1] = 2.0;
                m2[0, 2] = 3.0;
                m2[1, 0] = 4.0;
                m2[1, 1] = 5.0;
                m2[1, 2] = 6.0;
                m2[2, 0] = 7.0;
                m2[2, 1] = 8.0;
                m2[2, 2] = 9.0;

                Value[] val = new Value[5];
                val[0] = 1.1;
                val[1] = 1.0;
                val[2] = false;
                val[3] = "Hello";
                val[4] = "World";

                Value[] fVal = new Value[3];
                fVal[0] = 1;
                fVal[1] = 2.22;
                fVal[2] = 3.33;

                Value[] sVal = new Value[3];
                sVal[0] = "hello";
                sVal[1] = "world";
                sVal[2] = "test";

                Value[] cVal = new Value[3];
                cVal[0] = new Complex(1, 1);
                cVal[1] = new Complex(2, 2);
                cVal[2] = new Complex(3, 3);

                var size_3x1 = new Value(1, 2, 0);

                size_3x1.At(0, 0) = 3.0;
                size_3x1.At(0, 1) = 1.0;

                parser.DefineVar("s31", new Variable(size_3x1));
                Value ans = new Value(0);

                parser.DefineVar("ans", new Variable(ans));

                // some tests for vectors
                parser.DefineVar("va", new Variable(arr1));
                parser.DefineVar("vb", new Variable(arr2));
                parser.DefineVar("vc", new Variable(arr3));
                parser.DefineVar("vd", new Variable(arr4));
                parser.DefineVar("m1", new Variable(m1));
                parser.DefineVar("m2", new Variable(m2));

                parser.DefineVar("a", new Variable(fVal[0]));
                parser.DefineVar("b", new Variable(fVal[1]));
                parser.DefineVar("c", new Variable(fVal[2]));

                parser.DefineVar("ca", new Variable(cVal[0]));
                parser.DefineVar("cb", new Variable(cVal[1]));
                parser.DefineVar("cc", new Variable(cVal[2]));

                parser.DefineVar("sa", new Variable(sVal[0]));
                parser.DefineVar("sb", new Variable(sVal[1]));

                // Add functions for inspecting the parser properties
                parser.DefineFun(new FunListVar());
                parser.DefineFun(new FunListFunctions());
                parser.DefineFun(new FunListConst());
                parser.DefineFun(new FunBenchmark());
                parser.DefineFun(new FunEnableOptimizer());
                parser.DefineFun(new FunSelfTest());
                parser.DefineFun(new FunEnableDebugDump());
                parser.DefineFun(new FunTest0());
                parser.DefineFun(new FunPrint());


                parser.DefineFun(new FunLang());
                parser.EnableAutoCreateVar(true);

#if DEBUG
                ParserXBase.EnableDebugDump(bDumpStack: false, bDumpRPN: false);
#endif

                Value x = 1.0;
                Value y = new Complex(0, 1);
                parser.DefineVar("x", new Variable(x));
                parser.DefineVar("y", new Variable(y));
            }