16 Tuple<IEnumerable<KeyValuePair<string, IEnumerable<string>>>, IEnumerable<string>, IEnumerable<Token>>
22 IEnumerable<Token> tokenList = tokens.Memoize();
24 Tuple<IEnumerable<Token>, IEnumerable<Token>, IEnumerable<Token>, IEnumerable<Token>> partitioned =
26 IEnumerable<Token> switches = partitioned.Item1;
27 IEnumerable<Token> scalars = partitioned.Item2;
28 IEnumerable<Token> sequences = partitioned.Item3;
29 IEnumerable<Token> nonOptions = partitioned.Item4;
31 Tuple<IEnumerable<Token>, IEnumerable<Token>> valuesAndErrors =
32 nonOptions.PartitionByPredicate(v => v.IsValue());
33 IEnumerable<Token> values = valuesAndErrors.Item1;
34 IEnumerable<Token> errors = valuesAndErrors.Item2;
39 values.Select(t => t.Text),
44 public static Tuple<IEnumerable<Token>, IEnumerable<Token>, IEnumerable<Token>, IEnumerable<Token>>
48 List<Token> switchTokens =
new List<Token>();
49 List<Token> scalarTokens =
new List<Token>();
50 List<Token> sequenceTokens =
new List<Token>();
51 List<Token> nonOptionTokens =
new List<Token>();
52 Dictionary<Token, IList<Token>> sequences =
new Dictionary<Token, IList<Token>>();
53 Dictionary<Token, int> count =
new Dictionary<Token, int>();
54 Dictionary<Token, Maybe<int>> max =
new Dictionary<Token, Maybe<int>>();
56 bool separatorSeen =
false;
57 Token nameToken =
null;
59 foreach (
Token token
in tokens)
61 if (token.IsValueForced())
63 separatorSeen =
false;
64 nonOptionTokens.Add(token);
66 else if (token.IsName())
68 separatorSeen =
false;
70 if (typeLookup(token.
Text)
73 switch (info.TargetType)
77 switchTokens.Add(token);
83 scalarTokens.Add(nameToken);
90 if (!sequences.ContainsKey(nameToken))
92 sequences[nameToken] =
new List<Token>();
94 max[nameToken] = info.MaxItems;
105 nonOptionTokens.Add(token);
114 case SequenceState.ScalarTokenFound when nameToken ==
null:
115 case SequenceState.SequenceTokenFound when nameToken ==
null:
116 separatorSeen =
false;
118 nonOptionTokens.Add(token);
124 separatorSeen =
false;
126 scalarTokens.Add(token);
132 if (sequences.TryGetValue(nameToken, out IList<Token> sequence))
135 .MatchJust(out
int m) &&
136 count[nameToken] >= m)
140 nonOptionTokens.Add(token);
143 else if (token.IsValueFromSeparator())
145 separatorSeen =
true;
149 else if (separatorSeen)
152 separatorSeen =
false;
154 nonOptionTokens.Add(token);
166 separatorSeen =
false;
167 sequences[nameToken] =
new List<Token>(
new[] { token });
168 count[nameToken] = 0;
169 max[nameToken] =
Maybe.Nothing<
int>();
177 foreach (KeyValuePair<
Token, IList<Token>> kvp
in sequences)
179 if (kvp.Value.Empty())
181 nonOptionTokens.Add(kvp.Key);
185 sequenceTokens.Add(kvp.Key);
186 sequenceTokens.AddRange(kvp.Value);
190 return Tuple.Create((IEnumerable<Token>)switchTokens,
191 (IEnumerable<Token>)scalarTokens,
192 (IEnumerable<Token>)sequenceTokens,
193 (IEnumerable<Token>)nonOptionTokens