예제 #1
0
        public void Visit(Series target, Signature input)
        {
            var methodName = "ParseSeries";

            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

            var invocation = $"{methodName}(input, inputPosition, states, factory, (i, p, s, f) => {repeatedInvocation}, (i, p, s, f) => {delimInvocation})"; // Invocation

            var resultName = "result";

            writer.VarAssign(resultName, invocation);
            writer.IfNullReturnNull(resultName);

            var nodeReference = $"{resultName}.Node";
            var decl          = new Decl(target.ReturnType, nodeReference);

            var returnExpression = GetReturnExpression(target.ReturnType, new[] { decl }, $"{resultName}.Advanced", "factory", target.InterfaceMethod);

            if (input.IsMemoized)
            {
                var memField = NameGen.MemoizedFieldName(input.Name);
                returnExpression = $"states[inputPosition].{memField} = {returnExpression}";
            }
            writer.Return(returnExpression);
        }
예제 #2
0
        public void Visit(Sequence target, Signature input)
        {
            var returnedResults = new List <Decl>();

            int    stepIndex            = 0;
            var    currentInputPosition = "inputPosition";
            String currentAdvanced      = null;

            foreach (var step in target.Steps)
            {
                stepIndex++;
                var func       = step.Function;
                var type       = func.ReturnType;
                var invoker    = this.invokers[func];
                var resultName = $"r{stepIndex}";
                var nodeName   = $"{resultName}.Node";

                if (step.IsReturned)
                {
                    returnedResults.Add(new Decl(type, nodeName));
                }

                writer.VarAssign(resultName, invoker("input", currentInputPosition, "states", "factory"));                 // Invocation

                var thisAdvanced = $"{resultName}.Advanced";
                switch (step.MatchAction)
                {
                case MatchAction.Consume:
                    writer.IfNullReturnNull(resultName);
                    currentInputPosition = $"{currentInputPosition} + {thisAdvanced}";
                    currentAdvanced      = (currentAdvanced == null) ? (thisAdvanced) : ($"{currentAdvanced} + {thisAdvanced}");
                    break;

                case MatchAction.Fail:
                    writer.IfNotNullReturnNull(resultName); break;

                case MatchAction.Rewind:
                    writer.IfNullReturnNull(resultName); break;

                case MatchAction.Ignore:
                    writer.IfNullReturnNull(resultName);
                    currentInputPosition = $"{currentInputPosition} + {thisAdvanced}";
                    currentAdvanced      = (currentAdvanced == null) ? (thisAdvanced) : ($"{currentAdvanced} + {thisAdvanced}");
                    break;
                }
            }

            var returnExpression = GetReturnExpression(target.ReturnType, returnedResults, currentAdvanced, "factory", target.InterfaceMethod);

            if (input.IsMemoized)
            {
                var memField = NameGen.MemoizedFieldName(input.Name);
                returnExpression = $"states[inputPosition].{memField} = {returnExpression}";
            }
            writer.Return(returnExpression);
        }
예제 #3
0
        private void BasicTargetWithInterfaceMethod(IParseFunction target, InterfaceMethod interfaceMethod, Signature signature)
        {
            var resultName = "r";
            var nodeName   = $"{resultName}.Node";
            var invoker    = this.invokers[target];

            writer.VarAssign(resultName, invoker("input", "inputPosition", "states", "factory"));             // Invocation
            writer.IfNullReturnNull(resultName);

            var decl = new Decl(target.ReturnType, nodeName);

            var returnExpression = GetReturnExpression(target.ReturnType, new[] { decl }, $"{resultName}.Advanced", "factory", interfaceMethod);

            if (signature.IsMemoized)
            {
                var memField = NameGen.MemoizedFieldName(signature.Name);
                returnExpression = $"states[inputPosition].{memField} = {returnExpression}";
            }
            writer.Return(returnExpression);
        }
예제 #4
0
        public void Visit(Selection target, Signature input)
        {
            int stepIndex = 0;

            foreach (var step in target.Steps)
            {
                stepIndex++;
                var func       = step.Function;
                var invoker    = this.invokers[func];
                var resultName = $"r{stepIndex}";

                writer.VarAssign(resultName, invoker("input", "inputPosition", "states", "factory"));                 // Invocation

                var factoryName     = "factory";
                var interfaceMethod = step.InterfaceMethod;
                var nodeReference   = $"{resultName}.Node";

                IReadOnlyList <Decl> nodes;
                if (func.ReturnType is TupleNodeType tupleNodeType)
                {
                    nodes = tupleNodeType.Types.Select((i, j) => new Decl(i, $"{nodeReference}.Item{j + 1}")).ToList();
                }
                else
                {
                    nodes = new[] { new Decl(func.ReturnType, nodeReference) };
                }

                var returnExpression = GetReturnExpression(target.ReturnType, nodes, $"{resultName}.Advanced", factoryName, interfaceMethod);
                if (input.IsMemoized)
                {
                    var memField = NameGen.MemoizedFieldName(input.Name);
                    returnExpression = $"states[inputPosition].{memField} = {returnExpression}";
                }
                writer.LineOfCode($"if ({resultName} != null) return {returnExpression};");
            }

            // No choices matched
            writer.Return("null");
        }
예제 #5
0
        public void Visit(Repetition target, Signature input)
        {
            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 innerFunc       = target.InnerParseFunction;
            var innerInvocation = this.invokers[innerFunc]("i", "p", "s", "f");                                              // Invocation
            var invocation      = $"{methodName}(input, inputPosition, states, factory, (i, p, s, f) => {innerInvocation})"; // Invocation

            var resultName = "result";

            writer.VarAssign(resultName, invocation);
            writer.IfNullReturnNull(resultName);

            var nodeReference = $"{resultName}.Node";
            var decl          = new Decl(innerFunc.ReturnType, nodeReference);

            var returnExpression = GetReturnExpression(target.ReturnType, new[] { decl }, $"{resultName}.Advanced", "factory", target.InterfaceMethod);

            if (input.IsMemoized)
            {
                var memField = NameGen.MemoizedFieldName(input.Name);
                returnExpression = $"states[inputPosition].{memField} = {returnExpression}";
            }
            writer.Return(returnExpression);
        }