示例#1
0
        static SimpleMaths()
        {
            var number = Terminals.Double("Number");

            var expression = Nonterminal.Create <double>("Expression");

            expression.SetProductions(
                number.AsIs(),
                expression.Extended().Append("+").Extend(expression).Finish((x1, x2) => x1 + x2),
                expression.Extended().Append("-").Extend(expression).Finish((x1, x2) => x1 - x2),
                expression.Extended().Append("*").Extend(expression).Finish((x1, x2) => x1 * x2),
                expression.Extended().Append("/").Extend(expression).Finish((x1, x2) => x1 / x2),
                "-".Appended().Extend(expression).WithPrecedence(out var NEG).Finish(x => - x),
                expression.Extended().Append("^").Extend(expression).Finish(Math.Pow),
                "(".Appended().Extend(expression).Append(")").AsIs());

            var opScope = new OperatorScope(
                new LeftAssociative("+", "-"),
                new LeftAssociative("*", "/"),
                new PrecedenceOnly(NEG),
                new RightAssociative("^"));

            Designtime = expression.WithOperatorScope(opScope);
            Runtime    = Designtime.Build();
        }
示例#2
0
        static JSON()
        {
            var number = Terminal.Create("Number", (position, data) => ToDecimal(data),
                                         Join(
                                             Literal('-').Optional(),
                                             Literal('0').Or(OneOf("123456789").And(OneOf(PredefinedSets.Number).ZeroOrMore())),
                                             Literal('.').And(OneOf(PredefinedSets.Number).AtLeast(1)).Optional(),
                                             Join(
                                                 OneOf("eE"),
                                                 OneOf("+-").Optional(),
                                                 OneOf(PredefinedSets.Number).AtLeast(1)).Optional()));
            var jsonString = Terminals.StringEx("/bfnrt", true, false, '"', "String");
            var jsonObject = Nonterminal.Create <Json>("Object");
            var jsonArray  = Nonterminal.Create <Json>("Array");
            var value      = Nonterminal.Create("Value",
                                                jsonString.Finish(Json.NewString),
                                                number.AsIs(),
                                                jsonObject.AsIs(),
                                                jsonArray.AsIs(),
                                                "true".FinishConstant(Json.NewBool(true)),
                                                "false".FinishConstant(Json.NewBool(false)),
                                                "null".FinishConstant(Json.NewNull(null)));
            var arrayReversed = Nonterminal.Create <FSharpList <Json> >("Array Reversed");

            arrayReversed.SetProductions(
                arrayReversed.Extended().Append(",").Extend(value).Finish((xs, x) => FSharpList <Json> .Cons(x, xs)),
                value.Finish(ListModule.Singleton));
            var arrayOptional = Nonterminal.Create("Array Optional",
                                                   arrayReversed.Finish(ListModule.Reverse),
                                                   ProductionBuilder.Empty.FinishConstant(FSharpList <Json> .Empty));

            jsonArray.SetProductions("[".Appended().Extend(arrayOptional).Append("]").Finish(Json.NewArray));

            var objectElement = Nonterminal.Create <FSharpList <Tuple <string, Json> > >("Object Element");

            objectElement.SetProductions(
                objectElement.Extended().Append(",").Extend(jsonString).Append(":").Extend(value)
                .Finish((xs, k, v) => FSharpList <Tuple <string, Json> > .Cons(Tuple.Create(k, v), xs)),
                jsonString.Extended().Append(":").Extend(value).Finish((k, v) => ListModule.Singleton(Tuple.Create(k, v))));
            var objectOptional = Nonterminal.Create("Object Optional",
                                                    objectElement.Finish(x => Json.NewObject(MapModule.OfList(x))),
                                                    ProductionBuilder.Empty.FinishConstant(Json.NewObject(MapModule.Empty <string, Json>())));

            jsonObject.SetProductions("{".Appended().Extend(objectOptional).Append("}").AsIs());

            Designtime = value.CaseSensitive().UseDynamicCodeGen();
            Runtime    = Designtime.Build();
        }