private SyntaxToken ScanXmlElement(ScannerState state)
{
Debug.Assert(state == ScannerState.Element || state == ScannerState.EndElement || state == ScannerState.DocType);
SyntaxList<SyntaxNode> leadingTrivia = null;
while (CanGetChar())
{
char c = PeekChar();
switch (c)
{
// // Whitespace
// // S ::= (#x20 | #x9 | #xD | #xA)+
case UCH_CR:
case UCH_LF:
leadingTrivia = ScanXmlTrivia(c);
break;
case ' ':
case UCH_TAB:
leadingTrivia = ScanXmlTrivia(c);
break;
case '/':
if (CanGetCharAtOffset(1) && PeekAheadChar(1) == '>')
{
return XmlMakeEndEmptyElementToken(leadingTrivia);
}
return XmlMakeDivToken(leadingTrivia);
case '>':
return XmlMakeGreaterToken(leadingTrivia);
case '=':
return XmlMakeEqualsToken(leadingTrivia);
case '\'':
case DWCH_LSMART_Q:
case DWCH_RSMART_Q:
return XmlMakeSingleQuoteToken(leadingTrivia, c, isOpening: true);
case '"':
case DWCH_LSMART_DQ:
case DWCH_RSMART_DQ:
return XmlMakeDoubleQuoteToken(leadingTrivia, c, isOpening: true);
case '<':
if (CanGetCharAtOffset(1))
{
char ch = PeekAheadChar(1);
switch (ch)
{
case '!':
if (CanGetCharAtOffset(2))
{
switch ((PeekAheadChar(2)))
{
case '-':
if (CanGetCharAtOffset(3) && PeekAheadChar(3) == '-')
{
return XmlMakeBeginCommentToken(leadingTrivia, _scanNoTriviaFunc);
}
break;
case '[':
if (CanGetCharAtOffset(8) &&
PeekAheadChar(3) == 'C' &&
PeekAheadChar(4) == 'D' &&
PeekAheadChar(5) == 'A' &&
PeekAheadChar(6) == 'T' &&
PeekAheadChar(7) == 'A' &&
PeekAheadChar(8) == '[')
{
return XmlMakeBeginCDataToken(leadingTrivia, _scanNoTriviaFunc);
}
break;
case 'D':
if (CanGetCharAtOffset(8) &&
PeekAheadChar(3) == 'O' &&
PeekAheadChar(4) == 'C' &&
PeekAheadChar(5) == 'T' &&
PeekAheadChar(6) == 'Y' &&
PeekAheadChar(7) == 'P' &&
PeekAheadChar(8) == 'E')
{
return XmlMakeBeginDTDToken(leadingTrivia);
}
break;
}
}
return XmlLessThanExclamationToken(state, leadingTrivia);
case '?':
return XmlMakeBeginProcessingInstructionToken(leadingTrivia, _scanNoTriviaFunc);
case '/':
return XmlMakeBeginEndElementToken(leadingTrivia, _scanNoTriviaFunc);
}
}
return XmlMakeLessToken(leadingTrivia);
case '?':
if (CanGetCharAtOffset(1) && PeekAheadChar(1) == '>')
{
return XmlMakeEndProcessingInstructionToken(leadingTrivia);
}
return XmlMakeBadToken(leadingTrivia, 1, ERRID.ERR_IllegalXmlNameChar);
case '(':
return XmlMakeLeftParenToken(leadingTrivia);
case ')':
return XmlMakeRightParenToken(leadingTrivia);
case '!':
case ';':
case '#':
case ',':
case '}':
return XmlMakeBadToken(leadingTrivia, 1, ERRID.ERR_IllegalXmlNameChar);
case ':':
return XmlMakeColonToken(leadingTrivia);
case '[':
return XmlMakeOpenBracketToken(state, leadingTrivia);
case ']':
return XmlMakeCloseBracketToken(state, leadingTrivia);
default:
return ScanXmlNcName(leadingTrivia);
}
}
return MakeEofToken(leadingTrivia);
}