private DTDContentModel ReadCP (DTDElementDeclaration elem)
{
DTDContentModel model = null;
TryExpandPERef ();
if(PeekChar () == '(') {
model = new DTDContentModel (DTD, elem.Name);
ReadChar ();
SkipWhitespace ();
model.ChildModels.Add (ReadCP (elem));
SkipWhitespace ();
do {
if (PeekChar () == '%') {
TryExpandPERef ();
continue;
}
if(PeekChar ()=='|') {
// CPType=Or
if (model.OrderType == DTDContentOrderType.Seq)
throw NotWFError ("Inconsistent choice markup in sequence cp.");
model.OrderType = DTDContentOrderType.Or;
ReadChar ();
SkipWhitespace ();
AddContentModel (model.ChildModels, ReadCP (elem));
SkipWhitespace ();
}
else if(PeekChar () == ',') {
// CPType=Seq
if (model.OrderType == DTDContentOrderType.Or)
throw NotWFError ("Inconsistent sequence markup in choice cp.");
model.OrderType = DTDContentOrderType.Seq;
ReadChar ();
SkipWhitespace ();
model.ChildModels.Add (ReadCP (elem));
SkipWhitespace ();
}
else
break;
}
while(true);
ExpectAfterWhitespace (')');
}
else {
TryExpandPERef ();
model = new DTDContentModel (DTD, elem.Name);
model.ElementName = ReadName ();
}
switch(PeekChar ()) {
case '?':
model.Occurence = DTDOccurence.Optional;
ReadChar ();
break;
case '*':
model.Occurence = DTDOccurence.ZeroOrMore;
ReadChar ();
break;
case '+':
model.Occurence = DTDOccurence.OneOrMore;
ReadChar ();
break;
}
return model;
}