private bool CheckPreviousIsVariable(Token token) { if (token.Type == TokenType.CloseBracket) return true; if (token.Type == TokenType.String) return false; if (token.Type == TokenType.Literal) { if (String.IsNullOrEmpty(token.Value)) { return true; } #region determine defined variables switch (token.Value.ToLower()) { case "we": case "our": case "us": case "@": case "block": case "blocks": case "blocking": case "blockings": case "user": case "retweeter": case "protected": case "isprotected": case "is_protected": case "verified": case "isverified": case "is_verified": case "translator": case "istranslator": case "is_translator": case "contributorsenabled": case "contributors_enabled": case "iscontributorsenabled": case "is_contributors_enabled": case "geoenabled": case "geo_enabled": case "isgeoenabled": case "is_geo_enabled": case "id": case "status": case "statuses": case "statuscount": case "status_count": case "statusescount": case "statuses_count": case "friend": case "friends": case "following": case "followings": case "friendscount": case "friends_count": case "followingscount": case "followings_count": case "follower": case "followers": case "followerscount": case "followers_count": case "fav": case "favs": case "favorite": case "favorites": case "favscount": case "favs_count": case "favoritescount": case "favorites_count": case "list": case "listed": case "listcount": case "list_count": case "listedcount": case "listed_count": case "screenname": case "screen_name": case "name": case "username": case "bio": case "desc": case "description": case "loc": case "location": case "lang": case "language": case "dm": case "isdm": case "is_dm": case "message": case "ismessage": case "is_message": case "directmessage": case "direct_message": case "isdirectmessage": case "is_direct_message": case "rt": case "retweet": case "isretweet": case "is_retweet": case "replyto": case "reply_to": case "inreplyto": case "in_reply_to": case "mention": case "to": case "favorer": case "favorers": case "rts": case "retweets": case "retweeters": case "text": case "body": case "via": case "from": case "source": case "client": return true; } #endregion switch (token.Value[0]) { case '@': case '#': return true; } long n; return Int64.TryParse(token.Value, out n); } return false; }
private static ValueBase GetValue(TokenReader reader) { var literal = reader.LookAhead(); if (literal.Type == TokenType.String) { // immediate string value return new StringValue(reader.AssertGet(TokenType.String).Value); } if (literal.Type == TokenType.OperatorMultiple) { // for parsing asterisk user var pseudo = reader.AssertGet(TokenType.OperatorMultiple); literal = new Token(TokenType.Literal, "*", pseudo.DebugIndex); } else { literal = reader.AssertGet(TokenType.Literal); } // check first letter switch (literal.Value[0]) { case '@': // user screen name return GetAccountValue(literal.Value.Substring(1), reader); case '#': // user id return GetAccountValue(literal.Value, reader); } // check first layers switch (literal.Value.ToLower()) { case "*": case "we": case "our": case "us": return GetAccountValue("*", reader); case "@": reader.AssertGet(TokenType.Period); return GetAccountValue(reader.AssertGet(TokenType.Literal).Value, reader); case "user": case "retweeter": return GetUserValue(literal.Value == "retweeter", reader); case "list": return GetListValue(reader); default: long iv; if (Int64.TryParse(literal.Value, out iv)) { return new NumericValue(iv); } return GetStatusValue(literal.Value, reader); } }
private static ValueBase InstantiateValue(TokenReader reader) { Token literal = reader.LookAhead(); if (literal.Type == TokenType.String) { // immediate string value return new StringValue(reader.AssertGet(TokenType.String).Value); } if (literal.Type == TokenType.OperatorMultiple) { // for parsing asterisk user Token pseudo = reader.AssertGet(TokenType.OperatorMultiple); literal = new Token(TokenType.Literal, "*", pseudo.DebugIndex); } else { literal = reader.AssertGet(TokenType.Literal); } // check first layers switch (literal.Value) { case "*": return InstantiateLocalUsers("*", reader); case "local": reader.AssertGet(TokenType.Period); return InstantiateLocalUsers(reader.AssertGet(TokenType.Literal).Value, reader); case "user": case "retweeter": return InstantiateUserValue(literal.Value == "retweeter", reader); default: long iv; if (Int64.TryParse(literal.Value, out iv)) { return new NumericValue(iv); } return InstantiateStatusValue(literal.Value, reader); } }