public static void ThrowScanException(IScanner scanner, string errorMessage) { var token = scanner.Peek(); var helpMessage = scanner.GetHelpMessage(token); throw new ScanException($"{errorMessage}\r\n{helpMessage}"); }
public static TextSpan ConsumeAny <TTokenType>(this IScanner scanner, params TTokenType[] tokenTypes) where TTokenType : struct { for (var i = 0; i < tokenTypes.Length; i++) { var tokenType = tokenTypes[i].ToString(); var token = scanner.Peek(); if (token.Type == tokenType) { scanner.Consume(); return(token); } } var helpMessage = scanner.GetHelpMessage(scanner.Peek()); var tokenTypesStr = string.Join(",", tokenTypes.Select(x => x.ToString())); throw new ScanException($"Expect one of {tokenTypesStr}.\r\n{helpMessage}"); }
public SqlDom ParseExp(int ctxPrecedence) { var prefixToken = _scanner.Consume(); if (prefixToken.IsEmpty) { throw new Exception($"expect token but found NONE"); } PrefixParselet prefixParse = null; try { prefixParse = SqlSpec.Instance.Prefix(prefixToken.Type); } catch (KeyNotFoundException) { var tokenStr = _scanner.GetSpanString(prefixToken); var message = _scanner.GetHelpMessage(prefixToken); throw new ParseException($"Prefix '{tokenStr}' Parse fail.\r\n" + message); } return(ProcessPrefix(prefixToken, prefixParse, ctxPrecedence)); }
public static string GetHelpMessage(this IScanner scanner) { var token = scanner.Peek(); return(scanner.GetHelpMessage(token)); }