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); }
public override IEnumerator <ParseReport> Generate(LLnParser.ParserContext ctx, TokenStream stream) { var next = stream.Next(); ctx.PushResult(next == null); yield break; }
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); }
public abstract IEnumerator <ParseReport> Generate(LLnParser.ParserContext ctx, TokenStream stream);
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); }