Exemplo n.º 1
0
        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));
            }
        }
Exemplo n.º 2
0
        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)));
        }
Exemplo n.º 3
0
		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));
			}
		}
Exemplo n.º 4
0
		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));
		}