/// <summary> /// Converts lexer processings into a set of resulting tokens. /// </summary> /// <param name="this"></param> /// <returns></returns> public static IEnumerable <IToken> ToList(this CQLLexer @this) { return(tokensByLexer.GetValue(@this, lexer => { var res = new LinkedList <IToken>(); IToken next; //try { do { next = lexer.NextToken(); if (next.Channel == 0) { if (next.Type < 0) { next = new CommonToken(new Tuple <ITokenSource, ICharStream>(next.TokenSource, next.InputStream), TokenType_Caret, 0, next.StartIndex, next.StopIndex); } res.AddLast(next); } } while (next.Type >= 0); } /*catch (NoViableAltException) * { * res.AddLast(new CommonToken(CQLLexer.Eof)); * }*/ return res; })); }
/// <summary> /// Given the code, let the suggester provide next tokens (suggestions). /// </summary> /// <param name="code"></param> /// <returns></returns> public IEnumerable <Suggestion> GetSuggestions(string code) { var collector = new HashSet <Suggestion>(); var charStream = new AntlrInputStream(code); var lexer = new CQLLexer(charStream); Process(atn.states[0], new MyTokenStream(lexer.ToList()), collector, new ParserStack(), new HashSet <int>()); return(collector); }
/// <summary> /// Parses a user query (without validating it). You practically only get the syntax tree. /// </summary> /// <param name="text"></param> /// <param name="errorListener"></param> /// <returns></returns> public static Query ParseForSyntaxOnly(string text, IErrorListener errorListener = null) { var inputStream = new AntlrInputStream(text); var speakLexer = new CQLLexer(inputStream); var commonTokenStream = new CommonTokenStream(speakLexer); var parser = new CQLParser(commonTokenStream); AddErrorListener(parser, errorListener); var parseContext = parser.query(); var visitor = new QueryVisitor(); return(visitor.Visit(parseContext)); }