private static MiniSqlParserParser CreateParser(string inputStr , DBMSType dbmsType , bool forSqlAccessor) { var input = new AntlrInputStream(inputStr); var lexer = new MiniSqlParserLexer(input); var tokens = new CommonTokenStream(lexer); var parser = new MiniSqlParserParser(tokens); var astListener = new MakeASTListener(tokens, dbmsType, forSqlAccessor); var errorListener = new CumulativeErrorListener(); var lexerErrorListener = new CumulativeLexerErrorListener(); MiniSqlParserAST.SetDbmsType(lexer, parser, dbmsType); // 文法で曖昧な箇所は動的にしか発見できないらしい //parser.AddErrorListener(new DiagnosticErrorListener()); //parser.Interpreter.PredictionMode = PredictionMode.LlExactAmbigDetection; lexer.RemoveErrorListeners(); lexer.AddErrorListener(lexerErrorListener); parser.AddParseListener(astListener); parser.RemoveErrorListeners(); parser.AddErrorListener(errorListener); return(parser); }
private static void SetDbmsType(MiniSqlParserLexer lexer , MiniSqlParserParser parser , DBMSType dbmsType) { if (dbmsType == DBMSType.Unknown) { lexer.IsOracle = true; parser.IsOracle = true; lexer.IsMySql = true; parser.IsMySql = true; lexer.IsSQLite = true; parser.IsSQLite = true; lexer.IsMsSql = true; parser.IsMsSql = true; lexer.IsPostgreSql = true; parser.IsPostgreSql = true; lexer.IsPervasive = true; parser.IsPervasive = true; // Unkownの場合""で囲まれた文字列をIDENTIFIERとして // 認識させるためMySqlAnsiQuotes=trueとする. lexer.MySqlAnsiQuotes = true; } else if (dbmsType == DBMSType.Oracle) { lexer.IsOracle = true; parser.IsOracle = true; } else if (dbmsType == DBMSType.MySql) { lexer.IsMySql = true; parser.IsMySql = true; } else if (dbmsType == DBMSType.SQLite) { lexer.IsSQLite = true; parser.IsSQLite = true; } else if (dbmsType == DBMSType.MsSql) { lexer.IsMsSql = true; parser.IsMsSql = true; } else if (dbmsType == DBMSType.PostgreSql) { lexer.IsPostgreSql = true; parser.IsPostgreSql = true; } else if (dbmsType == DBMSType.Pervasive) { lexer.IsPervasive = true; parser.IsPervasive = true; } }