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); }
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); }
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); }