Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 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;
     }
 }