Esempio n. 1
0
        public void Visit(Series target, Access access)
        {
            // If generation not required for other reasons, series can be inlined using built-in functions
            Invoker invoker;
            Boolean isGenerated = AddSignature(target, access, requiresGeneration: false);             // Series is a built-in function

            // Applying recursion after adding the parent signature
            var visitor = new GenerateSignaturesVisitor(baseName + "_D", isMemoized: false, mustAddSignature: false, ruleMethodNames, this.signatures, this.invokers);

            target.RepeatedToken.ApplyVisitor(visitor, Access.Private);
            target.DelimiterToken.ApplyVisitor(visitor, Access.Private);

            if (isGenerated)
            {
                invoker = CreateInvoker(baseName);
            }
            else
            {
                var repeatedFunc       = target.RepeatedToken;
                var repeatedInvocation = this.invokers[repeatedFunc]("i", "p", "s", "f");                 // Invocation

                var delimFunc       = target.DelimiterToken;
                var delimInvocation = this.invokers[delimFunc]("i", "p", "s", "f");                                                                    // Invocation
                invoker = (i, p, s, f) => $"ParseSeries({i}, {p}, {s}, {f}, (i, p, s, f) => {repeatedInvocation}, (i, p, s, f) => {delimInvocation})"; // Invocation
            }

            AddInvoker(target, invoker);
        }
Esempio n. 2
0
        private void VisitFunctionWithSteps <T>(T target, Access access, String letter, Func <T, IReadOnlyList <IParseFunction> > stepsFunctions) where T : IParseFunction
        {
            AddSignature(target, access, requiresGeneration: true);             // Functions with steps must always generate a method

            int index = 0;

            foreach (var func in stepsFunctions(target))
            {
                index++;
                String stepBaseName = $"{baseName}_{letter}{index}";

                var visitor = new GenerateSignaturesVisitor(stepBaseName, isMemoized: false, mustAddSignature: false, ruleMethodNames, this.signatures, this.invokers);
                func.ApplyVisitor(visitor, Access.Private);
            }

            var invoker = CreateInvoker(baseName);

            AddInvoker(target, invoker);
        }
Esempio n. 3
0
        public void Visit(Repetition target, Access access)
        {
            // If generation not required for other reasons, repetition can be inlined using built-in functions
            Invoker invoker;
            Boolean isGenerated = AddSignature(target, access, requiresGeneration: false);

            // Applying recursion after adding the parent signature
            var innerFunc = target.InnerParseFunction;
            var visitor   = new GenerateSignaturesVisitor(baseName + "_M", isMemoized: false, mustAddSignature: false, ruleMethodNames, this.signatures, this.invokers);

            innerFunc.ApplyVisitor(visitor, Access.Private);

            if (isGenerated)
            {
                invoker = CreateInvoker(baseName);
            }
            else
            {
                String methodName;
                switch (target.Cardinality)
                {
                case Cardinality.Maybe: methodName = "ParseMaybe"; break;

                case Cardinality.Plus: methodName = "ParsePlus"; break;

                case Cardinality.Star: methodName = "ParseStar"; break;

                default: throw new InvalidOperationException();
                }

                var innerInvocation = this.invokers[innerFunc]("i", "p", "s", "f");                               // Invocation
                invoker = (i, p, s, f) => $"{methodName}({i}, {p}, {s}, {f}, (i, p, s, f) => {innerInvocation})"; // Invocation
            }

            AddInvoker(target, invoker);
        }