private TokenKind ScanToken()
{
if(this._currentCharacter == -1)
return TokenKind.EOT;
var current = (char) _currentCharacter;
if (char.IsLetter(current))
{
if (this.PeekChar() == ':')
{
TakeIt(); // letter
TakeIt(); // :
return TokenKind.WindowsRoot;
}
return TakeIdentifier();
}
if (IsNumeric(current))
{
return TakeIdentifier();
}
switch (this._currentCharacter)
{
case '*':
this.TakeIt();
if (this._currentCharacter == '*')
{
this.TakeIt();
return TokenKind.DirectoryWildcard;
}
return TokenKind.Wildcard;
case '?':
this.TakeIt();
return TokenKind.CharacterWildcard;
case '!':
this.TakeIt();
return TokenKind.CharacterSetInvert;
case '[':
this.TakeIt();
return TokenKind.CharacterSetStart;
case ']':
this.TakeIt();
return TokenKind.CharacterSetEnd;
case '{':
this.TakeIt();
return TokenKind.LiteralSetStart;
case ',':
this.TakeIt();
return TokenKind.LiteralSetSeperator;
case '}':
this.TakeIt();
return TokenKind.LiteralSetEnd;
case '/':
case '\\':
this.TakeIt();
return TokenKind.PathSeperator;
default:
throw new Exception("Unable to scan for next token. Stuck on '" + (char)this._currentCharacter + "'");
}
}