protected void NextToken()
{
while (char.IsWhiteSpace(_ch)) { NextChar(); }
TokenId t;
int tokenPos = _textPos;
switch (_ch)
{
case '!':
NextChar();
if (_ch == '=')
{
NextChar();
t = TokenId.ExclamationEqual;
}
else
{
t = TokenId.Exclamation;
}
break;
case '%':
NextChar();
t = TokenId.Percent;
break;
case '&':
NextChar();
if (_ch == '&')
{
NextChar();
t = TokenId.DoubleAmphersand;
}
else
{
t = TokenId.Amphersand;
}
break;
case '(':
NextChar();
t = TokenId.OpenParen;
break;
case ')':
NextChar();
t = TokenId.CloseParen;
break;
case '*':
NextChar();
t = TokenId.Asterisk;
break;
case '+':
NextChar();
t = TokenId.Plus;
break;
case ',':
NextChar();
t = TokenId.Comma;
break;
case '-':
NextChar();
t = TokenId.Minus;
break;
case '.':
NextChar();
t = TokenId.Dot;
break;
case '/':
NextChar();
t = TokenId.Slash;
break;
case ':':
NextChar();
t = TokenId.Colon;
break;
case '<':
NextChar();
if (_ch == '=')
{
NextChar();
t = TokenId.LessThanEqual;
}
else if (_ch == '>')
{
NextChar();
t = TokenId.LessGreater;
}
else
{
t = TokenId.LessThan;
}
break;
case '=':
NextChar();
if (_ch == '=')
{
NextChar();
t = TokenId.DoubleEqual;
}
else
{
t = TokenId.Equal;
}
break;
case '>':
NextChar();
if (_ch == '=')
{
NextChar();
t = TokenId.GreaterThanEqual;
}
else
{
t = TokenId.GreaterThan;
}
break;
case '{':
NextChar();
t = TokenId.OpenCurly;
break;
case '}':
NextChar();
t = TokenId.CloseCurly;
break;
case '?':
NextChar();
t = TokenId.Question;
break;
case '[':
NextChar();
t = TokenId.OpenBracket;
break;
case ']':
NextChar();
t = TokenId.CloseBracket;
break;
case '|':
NextChar();
if (_ch == '|')
{
NextChar();
t = TokenId.DoubleBar;
}
else
{
t = TokenId.Bar;
}
break;
case '"':
const char slashSymbol = '\\';
Action first = () =>
{
if (_ch == slashSymbol)
{
NextChar();
NextChar();
}
};
Action second = () =>
{
if (_ch == slashSymbol)
{
NextChar();
}
};
t = GetLiteralToken(first, second);
break;
case '\'':
t = GetLiteralToken(() => { }, () => { });
break;
default:
if (char.IsLetter(_ch) || _ch == '@' || _ch == '_')
{
do
{
NextChar();
} while (char.IsLetterOrDigit(_ch) || _ch == '_');
t = TokenId.Identifier;
break;
}
if (char.IsDigit(_ch))
{
t = TokenId.IntegerLiteral;
do
{
NextChar();
} while (char.IsDigit(_ch));
if (_ch == '.')
{
t = TokenId.RealLiteral;
NextChar();
ValidateDigit();
do
{
NextChar();
} while (char.IsDigit(_ch));
}
if (_ch == 'E' || _ch == 'e')
{
t = TokenId.RealLiteral;
NextChar();
if (_ch == '+' || _ch == '-') NextChar();
ValidateDigit();
do
{
NextChar();
} while (char.IsDigit(_ch));
}
if (_ch == 'F' || _ch == 'f') NextChar();
break;
}
if (_textPos == _textLen)
{
t = TokenId.End;
break;
}
throw ParseError(_textPos, Res.InvalidCharacter(_ch));
}
_token.ID = t;
_token.Text = _text.Substring(tokenPos, _textPos - tokenPos);
_token.Position = tokenPos;
}