Пример #1
0
        public void TestCalc1(bool useArray)
        {
            if (useArray)
            {
                LispPrinter.PrintVectorsAsLists = true;          //required to compare the results
            }
            IVectorFactory factory = useArray? (IVectorFactory) new ArrayVectorFactory() : (IVectorFactory) new BNodeVectorFactory();

            /*
             *  Expression ← Term ((‘+’ / ‘-’) Term)*
             *  Term ← Factor (('*' / '/') Factor)*
             *  Factor ← Number / '(' Expression ')'
             *  Number ← [0-9]+
             */
            Rule        eDigit  = new LiteralAnyCharOf("0123456789");
            Placeholder eNumber = new Placeholder();

            //eNumber.Expression = new First(new CallbackHandler( new Sequence(eDigit, eNumber), delegate(object v){
            //    object[] a = (object[])v;
            //    return string.Concat(a[0], a[1]);
            //}), eDigit);
            eNumber.Expression = new FirstOf(new CollapseToString(new Sequence(eDigit, eNumber)), new CallbackHandler(eDigit, Convert.ToString));
            //eNumber.Expression = new CallbackHandler(
            //    new First(new CollapseToString(new Sequence(eDigit, eNumber)), new CallbackHandler(eDigit, Convert.ToString)),
            //    delegate(object v) { return Int64.Parse((string)v); });
            //eNumber.Expression = new CollapseToArray(new First(new Sequence(eDigit, eNumber), new Sequence(eDigit, new TailStub())));
            Placeholder eAdditive       = new Placeholder();
            Placeholder eMultiplicative = new Placeholder();
            Rule        eSingular       = new FirstOf(eNumber,
                                                      new ExtractOne(1, new Sequence(new Literal('('), eAdditive, new Literal(')'))));
            //
            Placeholder eAdditiveSuffix = new Placeholder();

            eAdditiveSuffix.Expression = new FirstOf(
                new CallbackHandler(new Sequence(new LiteralAnyCharOf("+-"), eMultiplicative, eAdditiveSuffix), delegate(object v) {
                IVector a    = (IVector)v;
                IVector tail = (IVector)a[2];
                return(factory.InsertBefore(a[0], factory.InsertBefore(a[1], tail)));
                //return v;
                //return ((object[])v)[1];
            }),
                //new EmptyExpression(null));
                new EmptyRule(factory.Empty));
            //eAdditive.Expression = new CallbackHandler( new Sequence(eMultiplicative, eAdditiveSuffix), DoAdd);
            eAdditive.Expression = new CallbackHandler(new Sequence(eMultiplicative, eAdditiveSuffix), delegate(object v) {
                IVector a    = (IVector)v;
                IVector tail = (IVector)a[1];
                return(factory.InsertBefore(a[0], tail));
            });
            Placeholder eMultiplicativeSuffix = new Placeholder();

            eMultiplicativeSuffix.Expression = new FirstOf(
                new CallbackHandler(new Sequence(new LiteralAnyCharOf("*/"), eSingular, eMultiplicativeSuffix), delegate(object v) {
                IVector a    = (IVector)v;
                IVector tail = (IVector)a[2];
                return(factory.InsertBefore(a[0], factory.InsertBefore(a[1], tail)));
                //return v;
                //return ((object[])v)[1];
            }),
                //new EmptyExpression(null));
                new EmptyRule(factory.Empty));
            //eMultiplicative.Expression = new CallbackHandler(new Sequence(eSingular, eMultiplicativeSuffix), DoMultiply);
            eMultiplicative.Expression = new CallbackHandler(new Sequence(eSingular, eMultiplicativeSuffix), delegate(object v) {
                IVector a    = (IVector)v;
                IVector tail = (IVector)a[1];
                if (tail == factory.Empty)
                {
                    return(a[0]);
                }
                return(factory.InsertBefore(a[0], tail));
            });
            Rule expr = eAdditive;

            {
                var    parser = new Parser(expr, TextCursor.Create("12+3*45+6+789*(6+2)*9+0"), factory);
                Result r      = parser.Run();
                //string expected = "(+ 12 (* 3 45) 6 (* 7 8 9) 0)";
                string expected = "(12 + (3 * 45) + 6 + (789 * (6 + 2) * 9) + 0)";
                Assert.IsNotNull(r);
                Assert.IsFalse(r.Cursor.CanPop());
                Assert.AreEqual(expected, Convert.ToString(r.Value).Replace("\"", "").Replace("'", ""));
            }
            {
                var    parser = new Parser(expr, TextCursor.Create("120+34*((5*6+7)*8+9)-1"), factory);
                Result r      = parser.Run();
                Assert.IsNotNull(r);
                Assert.IsFalse(r.Cursor.CanPop());
                //Assert.AreEqual(120 + 34 * ((5 * 6 + 7) * 8 + 9) - 1, r.Value);
            }
        }