private void ParseElementMixedContent(ParticleContentValidator pcv, int startParenEntityId)
{
bool hasNames = false;
int connectorEntityId = -1;
int contentEntityId = _currentEntityId;
for (;;)
{
switch (GetToken(false))
{
case Token.RightParen:
pcv.CloseGroup();
if (_validate && _currentEntityId != startParenEntityId)
{
SendValidationEvent(_curPos, XmlSeverityType.Error, SR.Sch_ParEntityRefNesting, string.Empty);
}
if (GetToken(false) == Token.Star && hasNames)
{
pcv.AddStar();
}
else if (hasNames)
{
ThrowUnexpectedToken(_curPos, "*");
}
return;
case Token.Or:
if (!hasNames)
{
hasNames = true;
}
else
{
pcv.AddChoice();
}
if (_validate)
{
connectorEntityId = _currentEntityId;
if (contentEntityId < connectorEntityId)
{ // entity repl.text starting with connector
SendValidationEvent(_curPos, XmlSeverityType.Error, SR.Sch_ParEntityRefNesting, string.Empty);
}
}
if (GetToken(false) != Token.QName)
{
goto default;
}
XmlQualifiedName name = GetNameQualified(true);
if (pcv.Exists(name) && _validate)
{
SendValidationEvent(XmlSeverityType.Error, SR.Sch_DupElement, name.ToString());
}
pcv.AddName(name, null);
if (_validate)
{
contentEntityId = _currentEntityId;
if (contentEntityId < connectorEntityId)
{ // entity repl.text ending with connector
SendValidationEvent(_curPos, XmlSeverityType.Error, SR.Sch_ParEntityRefNesting, string.Empty);
}
}
continue;
default:
OnUnexpectedError();
break;
}
}
}