static void Try(string input, int server_version = 0) { //var str = new AntlrInputStream(input); var str = new AntlrInputStream(input); var lexer = new MySQLLexer(str); lexer.serverVersion = server_version; var tokens = new CommonTokenStream(lexer); var parser = new MySQLParser(tokens); parser.serverVersion = server_version; var listener = new ErrorListener <IToken>(parser, lexer, tokens); parser.AddErrorListener(listener); var tree = parser.queries(); if (listener.had_error) { System.Console.WriteLine("error in parse."); } else { System.Console.WriteLine("parse completed."); } System.Console.WriteLine(tokens.OutputTokens()); System.Console.WriteLine(tree.OutputTree(tokens)); }
public override string ReformatSpecificObject(string objtype, string createsql) { if (objtype == "view") { try { MySQLLexer lexer = new MySQLLexer(new ANTLRReaderStream(new StringReader(createsql))); CommonTokenStream tokens = new CommonTokenStream(lexer); MySQLParser parser = new MySQLParser(tokens); var res = parser.create_view(); if (parser.Errors != null) { UsageStats.Usage("warning:badview", "viewsql", createsql); return(createsql); } var tree = (Antlr.Runtime.Tree.ITree)res.Tree; var sw = new StringWriter(); var dmp = this.CreateDumper(sw); var admp = new AntlrTreeDumper(tree, createsql, dmp); admp.Run(); return(sw.ToString()); } catch { } } return(base.ReformatSpecificObject(objtype, createsql)); }
protected void LoadShowTable(TableStructure table) { string sql = CachedGetShowTable(table.FullName.Name); MySQLLexer lexer = new MySQLLexer(new ANTLRReaderStream(new StringReader(sql))); CommonTokenStream tokens = new CommonTokenStream(lexer); MySQLParser parser = new MySQLParser(tokens); parser.create_table(table, false); if (parser.Errors != null) { throw new MySqlParseCreateTableError(parser.Errors, sql); } // remove indexes, which only reflects foreign keys table._Constraints.RemoveIf(IndexShouldBeRemoved); // fix primary key table name foreach (var cnt in table.Constraints) { var fk = cnt as ForeignKey; if (fk == null) { continue; } fk.PrimaryKeyTable = NewNameWithSchema(table.FullName.Schema, fk.PrimaryKeyTable.Name); } }
public override List <DependencyItem> DetectDependencies(ISpecificObjectStructure spec) { if (spec.CreateSql == null) { return(new List <DependencyItem>()); } var dc = new DepsCollector(); MySQLLexer lexer = new MySQLLexer(new ANTLRReaderStream(new StringReader(spec.CreateSql))); CommonTokenStream tokens = new CommonTokenStream(lexer); MySQLParser parser = new MySQLParser(tokens); parser.find_deps(dc); if (parser.Errors != null) { var err = new InternalError("DAE-00057 Error parsing dependencies:" + parser.Errors); err.Data["sql"] = spec.CreateSql; throw err; } return(spec.BuildDependencyList(dc)); }
private static MySQL51Parser.program_return DoParse( CommonTokenStream tokens, bool expectErrors, out StringBuilder sb, Version version) { MySQLParser parser = new MySQLParser(tokens); parser.MySqlVersion = version; sb = new StringBuilder(); TextWriter tw = new StringWriter(sb); parser.TraceDestination = tw; MySQL51Parser.program_return r = null; int tokCount = tokens.Count; try { r = parser.program(); } catch (RewriteEmptyStreamException e) { if (!expectErrors) { sb.AppendLine(); sb.Append(e.Message); } } /* * The parser inserts a new <EOF> to the token stream, this is probably an ANTLR bug, the code here takes care of it. * */ if ((tokens.Count - 1) == tokCount) { TokenStreamRemovable tsr = (TokenStreamRemovable)tokens; tsr.Remove(tokens.Get(tokens.Count - 1)); } tokens.Reset(); return(r); }
private int parseQuery(string query) { var t = string.Empty; IMySQLRecognizerCommon mySQLRecognizerCommon = new MySQLRecognizerCommon(serverVersion, sqlMode); var lastErrors = new StringBuilder(); var errorListener = new TestErrorListener(lastErrors); var errorStrategy = new BailErrorStrategy(); var input = new AntlrInputStream(query); var lexer = new MySQLLexer(input, mySQLRecognizerCommon); lexer.RemoveErrorListeners(); lexer.AddErrorListener(errorListener); lexer.serverVersion = serverVersion; lexer.sqlMode = sqlMode; lexer.charsets = charsets; var tokens = new CommonTokenStream(lexer); var parser = new MySQLParser(tokens, mySQLRecognizerCommon); parser.serverVersion = serverVersion; parser.sqlMode = sqlMode; parser.BuildParseTree = buildParserTree; parser.ErrorHandler = errorStrategy; parser.Interpreter.PredictionMode = PredictionMode.SLL; parser.RemoveParseListeners(); tokens.Fill(); ParserRuleContext tree = default; try { tree = parser.query(); } catch (Antlr4.Runtime.Misc.ParseCanceledException) { // If parsing was cancelled we either really have a syntax error or we need to do a second step, // now with the default strategy and LL parsing. tokens.Reset(); parser.Reset(); parser.ErrorHandler = new DefaultErrorStrategy(); parser.Interpreter.PredictionMode = PredictionMode.LL; parser.AddErrorListener(errorListener); tree = parser.query(); } var toks = tokens.GetTokens(); t = input.GetText(new Antlr4.Runtime.Misc.Interval(toks[0].StartIndex, int.MaxValue)); if (dump && buildParserTree) { if (tree == null) { Trace.TraceInformation(@"No parse tree available"); } else { t = tree.GetText(); parseTreeView = tree.ToStringTree(parser); var text = $"Token count: {tokens.Size}{Environment.NewLine}{MySQLRecognizerCommon.dumpTree(tree, parser.Vocabulary)}"; Trace.TraceInformation(text.Trim()); } } return(parser.NumberOfSyntaxErrors); }