private IToken TryGetDataType()
        {
            // Expect to either see a start of a Uri or QName
            char next = Peek();

            if (next == '<')
            {
                // Uri specified DataType
                IToken temp = TryGetUri();
                LastTokenType = Token.DATATYPE;
                return(new DataTypeToken("<" + temp.Value + ">", temp.StartLine, temp.StartPosition, temp.EndPosition));
            }
            else if (Char.IsLetter(next) || UnicodeSpecsHelper.IsLetter(next) || next == '_')
            {
                // QName specified Data Type
                IToken temp = TryGetQName();
                if (temp.TokenType == Token.QNAME)
                {
                    LastTokenType = Token.DATATYPE;
                    return(new DataTypeToken(temp.Value, temp.StartLine, temp.StartPosition, temp.EndPosition));
                }
                else
                {
                    throw Error("Unexpected Token '" + temp.GetType().ToString() + "' was produced when a QName for a Data Type was expected!");
                }
            }
            else
            {
                // Invalid Start Character
                throw Error("Unexpected Character (Code " + (int)next + " " + next + "\nExpected a < to start a URI or a valid start character for a QName to specify Data Type");
            }
        }
        private bool IsValidVarName(String value)
        {
            if (_isValidVarName.IsMatch(value))
            {
                return(true);
            }
            else
            {
                // Have to validate Character by Character
                char[] cs    = value.ToCharArray();
                char   first = cs[0];

                // First character must be an underscore or letter
                if (first == '_' || Char.IsLetter(first) || UnicodeSpecsHelper.IsLetter(first))
                {
                    // Remaining Characters must be underscores, letters, numbers or hyphens
                    for (int i = 1; i < cs.Length; i++)
                    {
                        char c = cs[i];
                        if (c == '_' || c == '-' || Char.IsLetterOrDigit(c) || UnicodeSpecsHelper.IsLetterOrDigit(c))
                        {
                            // OK
                        }
                        else
                        {
                            // Invalid Character
                            return(false);
                        }
                    }

                    // If we get here it's all fine
                    return(true);
                }
                else
                {
                    // Invalid Start Character
                    return(false);
                }
            }
        }