in Microsoft.Azure.Cosmos/src/Query/Core/Parser/LASets.cs [608:735]
private bool Validate(List<Edge> parse, List<IToken> i)
{
List<Edge> q = parse.ToList();
q.Reverse();
List<IToken>.Enumerator ei = this.input.GetEnumerator();
List<Edge>.Enumerator eq = q.GetEnumerator();
bool fei = false;
bool feq = false;
for (; ; )
{
fei = ei.MoveNext();
IToken v = ei.Current;
if (!fei)
{
break;
}
bool empty = true;
for (; empty;)
{
feq = eq.MoveNext();
if (!feq)
{
break;
}
Edge x = eq.Current;
switch (x.type)
{
case TransitionType.RULE:
empty = true;
break;
case TransitionType.PREDICATE:
empty = true;
break;
case TransitionType.ACTION:
empty = true;
break;
case TransitionType.ATOM:
empty = false;
break;
case TransitionType.EPSILON:
empty = true;
break;
case TransitionType.INVALID:
empty = true;
break;
case TransitionType.NOT_SET:
empty = false;
break;
case TransitionType.PRECEDENCE:
empty = true;
break;
case TransitionType.SET:
empty = false;
break;
case TransitionType.WILDCARD:
empty = false;
break;
default:
throw new Exception();
}
}
Edge w = eq.Current;
if (w == null && v == null)
{
return true;
}
else if (w == null)
{
return false;
}
else if (v == null)
{
return false;
}
switch (w.type)
{
case TransitionType.ATOM:
{
IntervalSet set = w.label;
if (set != null && set.Count > 0)
{
if (!set.Contains(v.Type))
{
return false;
}
}
break;
}
case TransitionType.NOT_SET:
{
IntervalSet set = w.label;
set = set.Complement(IntervalSet.Of(TokenConstants.MinUserTokenType, this.parser.Atn.maxTokenType));
if (set != null && set.Count > 0)
{
if (!set.Contains(v.Type))
{
return false;
}
}
break;
}
case TransitionType.SET:
{
IntervalSet set = w.label;
if (set != null && set.Count > 0)
{
if (!set.Contains(v.Type))
{
return false;
}
}
break;
}
case TransitionType.WILDCARD:
break;
default:
throw new Exception();
}
}
return true;
}