private List <Token> RemainTokensToArgs(TokenReader reader)
        {
            var result = new List <Token>();

            while (reader.IsRemainToken)
            {
                var current = reader.Get();

                if (current.IsMatchType(TokenType.TargetSelector))
                {
                    if (reader.CheckNext(x => x.IsMatchType(TokenType.OpenSquareBracket)))
                    {
                        reader.Skip(x => x.IsMatchType(TokenType.CloseSquareBracket));
                        reader.MoveNext();
                    }
                }
                else if (current.IsMatchLiteral("minecraft"))
                {
                    if (reader.CheckNext(x => x.IsMatchType(TokenType.Colon)))
                    {
                        reader.MoveNext();
                        if (reader.CheckNext(x => x.IsMatchType(TokenType.Literal)))
                        {
                            current = reader.Get();
                        }
                        else
                        {
                            continue;
                        }
                    }
                }

                result.Add(current);
            }

            return(result);
        }
Beispiel #2
0
        private static ArgBodyTuple MakeArgBody(ref TokenReader reader)
        {
            System.Diagnostics.Debug.WriteLine("MakeArgBody");
            var token = reader.Get();

            if (token.Type != Token.TokenType.String && token.Type != Token.TokenType.Literal)
            {
                reader.PushError("不明な文字です: " + reader.LookAhead() + " (インデックス:" + reader.LookAhead().DebugIndex + ")" +
                                 "フィルタ引数は、単純な文字列かダブルクオートで括られた文字列のみが指定できます。");
            }
            var ret = new ArgBodyTuple()
            {
                Arg = token
            };

            AssertNextAny(ref reader, false, Token.TokenType.Comma, Token.TokenType.CloseBracket,
                          Token.TokenType.ConcatenatorAnd, Token.TokenType.ConcatenatorOr);
            return(ret);
        }
Beispiel #3
0
 /// <summary>
 /// 次のトークンを先読みし、指定した型であるかを判定します。
 /// </summary>
 /// <param name="reader">トークン リーダー</param>
 /// <param name="type">先読みするトークンの種類</param>
 /// <param name="trim">読み込みが合致した時にトークンを読み飛ばす</param>
 /// <returns>合致すればtrue</returns>
 private static bool TryLookAhead(ref TokenReader reader, Token.TokenType type, bool trim = true)
 {
     if (!reader.IsRemainToken)
     {
         return(false);
     }
     if (reader.LookAhead().Type == type)
     {
         if (trim)
         {
             reader.Get();
         }
         return(true);
     }
     else
     {
         return(false);
     }
 }
Beispiel #4
0
        /// <summary>
        /// Get the current token.
        /// </summary>
        /// <param name="uniqueIdentifier">The unique client identifier.</param>
        /// <param name="serviceName">The service name the client is connected to.</param>
        /// <param name="callback">The callback handler when a result is retured, a client web response.</param>
        /// <param name="actionName">The current action callback name.</param>
        /// <param name="state">The state callback handler object.</param>
        /// <exception cref="System.Exception"></exception>
        /// <exception cref="System.ArgumentNullException"></exception>
        public async void Get(string uniqueIdentifier, string serviceName, Action <string, Nequeo.Security.IPermission, object> callback, string actionName = "", object state = null)
        {
            Exception exec      = null;
            var       tokenData = await Nequeo.Threading.AsyncOperationResult <bool> .
                                  RunTask <string>(() =>
            {
                try
                {
                    return(TokenReader.Get(uniqueIdentifier, serviceName, _tokenData));
                }
                catch (Exception ex)
                {
                    exec = ex;
                    return(null);
                }
            });

            var permission = await Nequeo.Threading.AsyncOperationResult <bool> .
                             RunTask <Nequeo.Security.IPermission>(() =>
            {
                try
                {
                    return(TokenReader.GetPermission(uniqueIdentifier, serviceName, _tokenData));
                }
                catch (Exception ex)
                {
                    exec = ex;
                    return(null);
                }
            });

            if (exec != null)
            {
                if (_callback_Exception != null)
                {
                    _callback_Exception("Get", exec);
                }
            }
            if (callback != null)
            {
                callback(tokenData, permission, state);
            }
        }
Beispiel #5
0
        /// <summary>
        /// 次に出現するトークンが特定の種類であることを確認し、読みます。<para />
        /// 読めなかった場合はリワインドします。
        /// </summary>
        /// <param name="reader">トークン リーダー</param>
        /// <param name="type">トークンの種類</param>
        private static Token AssertNext(ref TokenReader reader, Token.TokenType type)
        {
            if (!reader.IsRemainToken)
            {
                reader.PushError("クエリが解析の途中で終了しました。" +
                                 "ここには " + type.ToString() + " が存在しなければなりません。");
            }
            var ntoken = reader.Get();

            if (ntoken.Type != type)
            {
                reader.PushError("不明な文字です: " + reader.LookAhead() + " (インデックス:" + reader.LookAhead().DebugIndex + ")" +
                                 "ここには " + type.ToString() + " が存在しなければなりません。");
                return(new Token()
                {
                    Type = type, Value = null, DebugIndex = -1
                });
            }
            return(ntoken);
        }
Beispiel #6
0
        static SyntaxTuple MakeTuples(IEnumerable <Token> tokens)
        {
            var       reader = new TokenReader(tokens);
            RootTuple roots  = null;

            try
            {
                roots = MakeRoot(ref reader);
            }
            catch (ArgumentException e)
            {
                throw new ArgumentException(e.Message + Environment.NewLine +
                                            "他のエラー:" + String.Join(Environment.NewLine, reader.Errors()), e);
            }
            if (reader.IsContainErrors)
            {
                throw new ArgumentException("シンタックス エラー:" + String.Join(Environment.NewLine, reader.Errors()));
            }
            if (reader.IsRemainToken)
            {
                throw new ArgumentException("閉じ括弧が多すぎる可能性があります。(クエリは途中で解析を完了しました) (next:@" + reader.Get().DebugIndex + ")");
            }
            return(roots);
        }
Beispiel #7
0
 /// <summary>
 /// 次のトークンを先読みし、指定した型であるかを判定します。
 /// </summary>
 /// <param name="reader">トークン リーダー</param>
 /// <param name="type">先読みするトークンの種類</param>
 /// <param name="trim">読み込みが合致した時にトークンを読み飛ばす</param>
 /// <returns>合致すればtrue</returns>
 private static bool TryLookAhead(ref TokenReader reader, Token.TokenType type, bool trim = true)
 {
     if (!reader.IsRemainToken)
         return false;
     if (reader.LookAhead().Type == type)
     {
         if (trim)
             reader.Get();
         return true;
     }
     else
     {
         return false;
     }
 }
Beispiel #8
0
 static SyntaxTuple MakeTuples(IEnumerable<Token> tokens)
 {
     var reader = new TokenReader(tokens);
     RootTuple roots = null;
     try
     {
         roots = MakeRoot(ref reader);
     }
     catch (ArgumentException e)
     {
         throw new ArgumentException(e.Message + Environment.NewLine +
             "他のエラー:" + String.Join(Environment.NewLine, reader.Errors()), e);
     }
     if (reader.IsContainErrors)
     {
         throw new ArgumentException("シンタックス エラー:" + String.Join(Environment.NewLine, reader.Errors()));
     }
     if (reader.IsRemainToken)
     {
         throw new ArgumentException("閉じ括弧が多すぎる可能性があります。(クエリは途中で解析を完了しました) (next:@" + reader.Get().DebugIndex + ")");
     }
     return roots;
 }
Beispiel #9
0
 private static ArgBodyTuple MakeArgBody(ref TokenReader reader)
 {
     System.Diagnostics.Debug.WriteLine("MakeArgBody");
     var token = reader.Get();
     if (token.Type != Token.TokenType.String && token.Type != Token.TokenType.Literal)
     {
         reader.PushError("不明な文字です: " + reader.LookAhead() + " (インデックス:" + reader.LookAhead().DebugIndex + ")" +
         "フィルタ引数は、単純な文字列かダブルクオートで括られた文字列のみが指定できます。");
     }
     var ret = new ArgBodyTuple() { Arg = token };
     AssertNextAny(ref reader, false, Token.TokenType.Comma, Token.TokenType.CloseBracket,
         Token.TokenType.ConcatenatorAnd, Token.TokenType.ConcatenatorOr);
     return ret;
 }
Beispiel #10
0
 /// <summary>
 /// 次に出現するトークンが特定の種類であることを確認し、読みます。<para />
 /// 読めなかった場合はリワインドします。
 /// </summary>
 /// <param name="reader">トークン リーダー</param>
 /// <param name="type">トークンの種類</param>
 private static Token AssertNext(ref TokenReader reader, Token.TokenType type)
 {
     if (!reader.IsRemainToken)
         reader.PushError("クエリが解析の途中で終了しました。" +
             "ここには " + type.ToString() + " が存在しなければなりません。");
     var ntoken = reader.Get();
     if (ntoken.Type != type)
     {
         reader.PushError("不明な文字です: " + reader.LookAhead() + " (インデックス:" + reader.LookAhead().DebugIndex + ")" +
             "ここには " + type.ToString() + " が存在しなければなりません。");
         return new Token() { Type = type, Value = null, DebugIndex = -1 };
     }
     return ntoken;
 }
Beispiel #11
0
 private static ArgBodyTuple MakeArgBody(ref TokenReader reader)
 {
     var token = reader.Get();
     if (token.Type != Token.TokenType.String && token.Type != Token.TokenType.Literal)
     {
         throw new ArgumentException("引数が不正です。(@" + token.DebugIndex + ") " + token.ToString());
     }
     var abt = new ArgBodyTuple() { Argument = token };
     if (TryLookAhead(ref reader, Token.TokenType.Comma))
     {
         abt.ArgBody = MakeArgBody(ref reader);
     }
     return abt;
 }
Beispiel #12
0
 private static ExpressionTuple MakeExpression(ref TokenReader reader)
 {
     var extuple = new ExpressionTuple()
     {
         ExpressionBody = MakeExpressionBody(ref reader)
     };
     if (reader.IsRemainToken)
     {
         var ntoken = reader.LookAhead();
         switch (ntoken.Type)
         {
             case Token.TokenType.ConcatenatorAnd:
                 reader.Get();
                 extuple.ConcatOr = false;
                 extuple.Expression = MakeExpression(ref reader);
                 break;
             case Token.TokenType.ConcatenatorOr:
                 reader.Get();
                 extuple.ConcatOr = true;
                 extuple.Expression = MakeExpression(ref reader);
                 break;
             case Token.TokenType.CloseBracket:
                 break;
             default:
                 throw new ArgumentException("トークン " + ntoken.ToString() + " はここに置くことはできません。(@" + ntoken.DebugIndex + ")");
         }
     }
     return extuple;
 }
Beispiel #13
0
 /// <summary>
 /// 次に出現するトークンが特定の種類であることを確認し、読みます。<para />
 /// 読めなかった場合はリワインドします。
 /// </summary>
 /// <param name="reader">トークン リーダー</param>
 /// <param name="type">トークンの種類</param>
 private static Token AssertNext(ref TokenReader reader, Token.TokenType type)
 {
     if (!reader.IsRemainToken)
         throw new ArgumentException("クエリ トークン種別 " + type.ToString() + " を読もうとしましたが、ぶった切れています。");
     var ntoken = reader.Get();
     if (ntoken.Type != type)
     {
         reader.PushError("クエリ トークン " + type.ToString() + " が必要です。または、トークンの種類が違います。(読み込まれたトークン: " + ntoken + ") (@" + ntoken.DebugIndex + ")");
         return new Token() { Type = type, Value = null, DebugIndex = -1 };
     }
     return ntoken;
 }