Token GetIdentifier(StringReader reader) { StringBuilder identifierBuilder = new StringBuilder(); char symbol; while (true) { int peekResult = reader.Peek(); if (peekResult == -1) { break; } symbol = (char)peekResult; if (ParseRules.IsValidIdentifierChar(symbol)) { identifierBuilder.Append(symbol); reader.Read(); continue; } if (ParseRules.IsStopForIdentifierOrLiteralChar(symbol)) { break; } throw new ArgumentException(String.Format("Unexpected character in identifier token: \"{0}\"", symbol)); } return(new IdentifierToken(identifierBuilder.ToString())); }
Token GetNumber(StringReader reader) { StringBuilder literalBuilder = new StringBuilder(); char symbol, lastSymbol = (char)0; bool pointWasPut = false, exponentSignWasPut = false, exponentWasPut = false; while (true) { int peekResult = reader.Peek(); if (peekResult == -1) { break; } symbol = (char)peekResult; if (ParseRules.IsValidNumberChar(symbol, lastSymbol, pointWasPut, exponentSignWasPut, exponentWasPut)) { if (ParseRules.IsDecimalPointChar(symbol)) { pointWasPut = true; } if (ParseRules.IsSignChar(symbol)) { exponentSignWasPut = true; } if (ParseRules.IsExponentChar(symbol)) { exponentWasPut = true; } literalBuilder.Append(symbol); lastSymbol = symbol; reader.Read(); continue; } if (ParseRules.IsStopForIdentifierOrLiteralChar(symbol)) { break; } throw new ArgumentException(String.Format("Unexpected character in number token: \"{0}\"", symbol)); } return(new NumberToken(Double.Parse(literalBuilder.ToString(), System.Globalization.NumberStyles.AllowExponent | System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.CultureInfo.InvariantCulture))); }