private void GatherCandidatesFromGrammarItem(ISqlGrammarRuleSequenceItem item, ICollection <TerminalCandidate> candidates) { if (item is SqlGrammarRuleSequenceNonTerminal nonTerminal) { GatherCandidatesFromNonterminal(nonTerminal, candidates); } else if (!TerminatorIds.Contains(item.Id)) { List <string> followingMandatoryCandidates = null; var terminal = ((SqlGrammarRuleSequenceTerminal)item).Terminal; if (terminal.IsFixed) { followingMandatoryCandidates = new List <string>(); for (var j = item.SequenceIndex + 1; j < item.ParentSequence.Items.Length; j++) { if (!GetFollowingMandatoryCandidates((ISqlGrammarRuleSequenceItem)item.ParentSequence.Items[j], followingMandatoryCandidates)) { break; } } } candidates.Add(new TerminalCandidate(item.Id, followingMandatoryCandidates)); } }
private static bool GetFollowingMandatoryCandidates(ISqlGrammarRuleSequenceItem item, ICollection <string> followingMandatoryCandidates) { if (!item.IsRequired) { return(false); } if (item.Type == NodeType.Terminal) { var terminal = ((SqlGrammarRuleSequenceTerminal)item).Terminal; if (terminal.IsFixed && terminal.Value.Length > 1) { followingMandatoryCandidates.Add(item.Id); return(true); } return(false); } var nonTerminal = (SqlGrammarRuleSequenceNonTerminal)item; return(nonTerminal.TargetRule.Sequences.Length == 1 && nonTerminal.TargetRule.Sequences[0].Items .All(childItem => GetFollowingMandatoryCandidates((ISqlGrammarRuleSequenceItem)childItem, followingMandatoryCandidates))); }
private void GatherCandidatesFromGrammarItem(ISqlGrammarRuleSequenceItem item, ICollection<TerminalCandidate> candidates) { var nonTerminal = item as SqlGrammarRuleSequenceNonTerminal; if (nonTerminal != null) { GatherCandidatesFromNonterminal(nonTerminal, candidates); } else if (!TerminatorIds.Contains(item.Id)) { List<string> followingMandatoryCandidates = null; var terminal = ((SqlGrammarRuleSequenceTerminal)item).Terminal; if (terminal.IsFixed) { followingMandatoryCandidates = new List<string>(); for (var j = item.SequenceIndex + 1; j < item.ParentSequence.Items.Length; j++) { if (!GetFollowingMandatoryCandidates((ISqlGrammarRuleSequenceItem)item.ParentSequence.Items[j], followingMandatoryCandidates)) { break; } } } candidates.Add(new TerminalCandidate(item.Id, followingMandatoryCandidates)); } }
private static bool GetFollowingMandatoryCandidates(ISqlGrammarRuleSequenceItem item, ICollection<string> followingMandatoryCandidates) { if (!item.IsRequired) { return false; } if (item.Type == NodeType.Terminal) { var terminal = ((SqlGrammarRuleSequenceTerminal)item).Terminal; if (terminal.IsFixed && terminal.Value.Length > 1) { followingMandatoryCandidates.Add(item.Id); return true; } return false; } var nonTerminal = (SqlGrammarRuleSequenceNonTerminal)item; return nonTerminal.TargetRule.Sequences.Length == 1 && nonTerminal.TargetRule.Sequences[0].Items .All(childItem => GetFollowingMandatoryCandidates((ISqlGrammarRuleSequenceItem)childItem, followingMandatoryCandidates)); }