private Node BuildTree(EarleyRule rule, int stateIdx) { if (rule == null) { throw new SyntaxException($"Attempt to complete an empty rule in #{stateIdx} state"); } var node = new Node { Symbol = rule.Name }; int matchedIdx = rule.Dot - 1; while (matchedIdx >= 0) { var matchedTerm = rule[matchedIdx] as NonTerminal; if (matchedTerm != null) { int idx = matchedIdx; var derivatives = _chart[stateIdx] .FinalRules(matchedTerm) .Where(r => _chart[r.Start].Contains(rule.WithDot(idx))); var rules = derivatives as IList <EarleyRule> ?? derivatives.ToList(); var child = BuildTree(rules.First(), stateIdx); node.Add(child); foreach (var deriv in rules.Skip(1)) { child.Next = BuildTree(deriv, stateIdx); child = child.Next; } stateIdx = rules[0].Start; } else { node.Add(new Node { Symbol = rule[matchedIdx] }); stateIdx--; } matchedIdx--; } return(node); }
private Node BuildTree(EarleyRule rule, int stateIdx) { if (rule == null) throw new SyntaxException($"Attempt to complete an empty rule in #{stateIdx} state"); var node = new Node { Symbol = rule.Name }; int matchedIdx = rule.Dot - 1; while (matchedIdx >= 0) { var matchedTerm = rule[matchedIdx] as NonTerminal; if (matchedTerm != null) { int idx = matchedIdx; var derivatives = _chart[stateIdx] .FinalRules(matchedTerm) .Where(r => _chart[r.Start].Contains(rule.WithDot(idx))); var rules = derivatives as IList<EarleyRule> ?? derivatives.ToList(); var child = BuildTree(rules.First(), stateIdx); node.Add(child); foreach (var deriv in rules.Skip(1)) { child.Next = BuildTree(deriv, stateIdx); child = child.Next; } stateIdx = rules[0].Start; } else { node.Add(new Node { Symbol = rule[matchedIdx] }); stateIdx--; } matchedIdx--; } return node; }