private ParsingEvent ParseDocumentStart(bool isImplicit)
{
// Parse extra document end indicators.
if (!isImplicit)
{
while (GetCurrentToken() is DocumentEnd)
{
Skip();
}
}
// Parse an isImplicit document.
if (isImplicit && !(GetCurrentToken() is VersionDirective || GetCurrentToken() is TagDirective || GetCurrentToken() is DocumentStart || GetCurrentToken() is StreamEnd))
{
var directives = new TagDirectiveCollection();
ProcessDirectives(directives);
states.Push(ParserState.DocumentEnd);
state = ParserState.BlockNode;
return new Events.DocumentStart(null, directives, true, GetCurrentToken().Start, GetCurrentToken().End);
}
// Parse an explicit document.
else if (!(GetCurrentToken() is StreamEnd))
{
Mark start = GetCurrentToken().Start;
var directives = new TagDirectiveCollection();
var versionDirective = ProcessDirectives(directives);
var current = GetCurrentToken();
if (!(current is DocumentStart))
{
throw new SemanticErrorException(current.Start, current.End, "Did not find expected <document start>.");
}
states.Push(ParserState.DocumentEnd);
state = ParserState.DocumentContent;
ParsingEvent evt = new Events.DocumentStart(versionDirective, directives, false, start, current.End);
Skip();
return evt;
}
// Parse the stream end.
else
{
state = ParserState.StreamEnd;
ParsingEvent evt = new Events.StreamEnd(GetCurrentToken().Start, GetCurrentToken().End);
// Do not call skip here because that would throw an exception
if (scanner.MoveNextWithoutConsuming())
{
throw new InvalidOperationException("The scanner should contain no more tokens.");
}
return evt;
}
}