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); }
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); }
/// <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); } }
/// <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); } }
/// <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); }
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); }
/// <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; } }
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; }
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; }
/// <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; }
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; }
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; }
/// <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; }