private void ReadSpecialToken() { var start = _position; var end = _position; _currentIdentifierChars.Clear(); // We track an identifier to check if it is a keyword (inf, true, false) var firstChar = _c; _currentIdentifierChars.Add(_c); NextChar(); // IF we have a digit, this is a -1 or +2 if ((firstChar == '+' || firstChar == '-') && CharHelper.IsDigit(_c)) { _currentIdentifierChars.Clear(); ReadNumberOrDate(firstChar, start); return; } while (CharHelper.IsIdentifierContinue(_c)) { // We track an identifier to check if it is a keyword (inf, true, false) _currentIdentifierChars.Add(_c); end = _position; NextChar(); } if (MatchCurrentIdentifier("true")) { _token = new SyntaxTokenValue(TokenKind.True, start, end, BoxedValues.True); } else if (MatchCurrentIdentifier("false")) { _token = new SyntaxTokenValue(TokenKind.False, start, end, BoxedValues.False); } else if (MatchCurrentIdentifier("inf")) { _token = new SyntaxTokenValue(TokenKind.Infinite, start, end, BoxedValues.FloatPositiveInfinity); } else if (MatchCurrentIdentifier("+inf")) { _token = new SyntaxTokenValue(TokenKind.PositiveInfinite, start, end, BoxedValues.FloatPositiveInfinity); } else if (MatchCurrentIdentifier("-inf")) { _token = new SyntaxTokenValue(TokenKind.NegativeInfinite, start, end, BoxedValues.FloatNegativeInfinity); } else if (MatchCurrentIdentifier("nan")) { _token = new SyntaxTokenValue(TokenKind.Nan, start, end, BoxedValues.FloatNan); } else if (MatchCurrentIdentifier("+nan")) { _token = new SyntaxTokenValue(TokenKind.PositiveNan, start, end, BoxedValues.FloatPositiveNaN); } else if (MatchCurrentIdentifier("-nan")) { _token = new SyntaxTokenValue(TokenKind.NegativeNan, start, end, BoxedValues.FloatNegativeNaN); } else { _token = new SyntaxTokenValue(TokenKind.Invalid, start, end); } _currentIdentifierChars.Clear(); }