Example #1
0
        public override IEnumerator <ParseReport> Generate(LLnParser.ParserContext ctx, TokenStream stream)
        {
            if (paths == null)
            {
                paths = new NonTerminalPath[token.Count];
                for (int i = 0, len = token.Count; i < len; i++)
                {
                    paths[i] = new NonTerminalPath(token, i);
                }
            }

            while (index < paths.Length)
            {
                var path = paths[index];
                yield return(ParseReport.Wait(path.Generate(ctx, stream)));

                if (path.IsClosed)
                {
                    index++;
                }

                if (index >= paths.Length)
                {
                    isClosed = true;
                }

                if (ctx.PopResult())
                {
                    ctx.PushResult(true);
                    yield break;
                }
            }

            ctx.PushResult(false);
        }
Example #2
0
        public override IEnumerator <ParseReport> Generate(LLnParser.ParserContext ctx, TokenStream stream)
        {
            var next = stream.Next();

            ctx.PushResult(next == null);
            yield break;
        }
Example #3
0
        public override IEnumerator <ParseReport> Generate(LLnParser.ParserContext ctx, TokenStream stream)
        {
            var next = stream.Next();

            if (next == null)
            {
                ctx.PushResult(false);
                yield break;
            }

            var rst = terminal.Match(next);

            if (rst)
            {
                token = next;
            }
            ctx.PushResult(rst);
        }
Example #4
0
 public abstract IEnumerator <ParseReport> Generate(LLnParser.ParserContext ctx, TokenStream stream);
Example #5
0
        public override IEnumerator <ParseReport> Generate(LLnParser.ParserContext ctx, TokenStream stream)
        {
            if (nodes == null)
            {
                nodes = new ParseNode[path.Length];
                for (var i = 0; i < path.Length; i++)
                {
                    nodes[i] = path[i].CreateNode();
                }
            }

            int n;

            if (init)
            {
                init = false;
                n    = 0;
            }
            else
            {
                n = nodes.Length - 1;
                if (!BackTrace(ref n, stream))
                {
                    isClosed = true;
                    ctx.PushResult(false);
                    yield break;
                }

                for (var i = n + 1; i < nodes.Length; i++)
                {
                    nodes[i].Clear();
                }
            }

            while (n < nodes.Length)
            {
                offsets.Push(stream.Offset);
                yield return(ParseReport.Wait(nodes[n].Generate(ctx, stream)));

                if (ctx.PopResult())
                {
                    n++;
                    continue;
                }

                offsets.Pop();
                n--;
                if (!BackTrace(ref n, stream))
                {
                    isClosed = true;
                    ctx.PushResult(false);
                    yield break;
                }

                for (var i = n + 1; i < nodes.Length; i++)
                {
                    nodes[i].Clear();
                }
            }

            ctx.PushResult(true);
        }