refactor: unify the parser generator to antlr4
This commit is contained in:
@ -1,31 +0,0 @@
|
||||
import * as commentFilter from '../core/comment';
|
||||
|
||||
/**
|
||||
* 过滤--注释
|
||||
* @param {String} sql
|
||||
*/
|
||||
function filterComments(sql) {
|
||||
return commentFilter.parse(sql).text;
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除注释和前后空格
|
||||
* @param {String} sql
|
||||
*/
|
||||
function cleanSql(sql) {
|
||||
return filterComments(sql);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分割sql
|
||||
* @param {String} sql
|
||||
*/
|
||||
function splitSql(sql) {
|
||||
return commentFilter.parse(sql).lines
|
||||
}
|
||||
|
||||
export {
|
||||
filterComments,
|
||||
cleanSql,
|
||||
splitSql
|
||||
}
|
@ -1,58 +0,0 @@
|
||||
import * as antlr4 from 'antlr4'
|
||||
import { ErrorListener } from 'antlr4/error';
|
||||
import { sqlLexer } from '../antlr4/flinksql/sqlLexer';
|
||||
import { sqlParser } from '../antlr4/flinksql/sqlParser';
|
||||
import { sqlVisitor } from '../antlr4/flinksql/sqlVisitor';
|
||||
|
||||
import { splitSql } from '../utils'
|
||||
|
||||
interface SyntaxError {
|
||||
line: number;
|
||||
column: number;
|
||||
token: antlr4.Token;
|
||||
errorMsg: string;
|
||||
}
|
||||
|
||||
class SqlErrorListener extends ErrorListener {
|
||||
error: SyntaxError = null;
|
||||
syntaxError (recognizer: antlr4.Recognizer, offendingSymbol: antlr4.Token, line: number, charPositionInLine: number, msg: string, e: any) {
|
||||
this.error = {
|
||||
line,
|
||||
column: charPositionInLine,
|
||||
token: offendingSymbol,
|
||||
errorMsg: msg
|
||||
};
|
||||
}
|
||||
}
|
||||
function parserSingle (sql: string,) {
|
||||
if (!sql || !sql.trim()) {
|
||||
return null;
|
||||
}
|
||||
const inputStream = new antlr4.InputStream(sql.toUpperCase());
|
||||
const lexer = <unknown>new sqlLexer(inputStream) as antlr4.Lexer;
|
||||
const tokenStream = new antlr4.CommonTokenStream(lexer);
|
||||
const parser: any = new sqlParser(tokenStream);
|
||||
parser.buildParseTrees = true;
|
||||
let listener = new SqlErrorListener();
|
||||
parser.addErrorListener(listener)
|
||||
parser.singleStatement();
|
||||
return listener.error;
|
||||
}
|
||||
function parserSyntax (sql: sql): SyntaxError {
|
||||
let runSql = typeof sql == 'string' ? sql : sql.join('');
|
||||
const sqls = splitSql(runSql);
|
||||
for (let i = 0, index = 0; i < sqls.length; i++) {
|
||||
let end = runSql[sqls[i]] == ';' ? sqls[i] : sqls[i] + 1
|
||||
/**
|
||||
* 这边不取分号
|
||||
*/
|
||||
let sql = new Array(index).fill(' ').join('') + runSql.substring(index, end);
|
||||
let err = parserSingle(sql);
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
index = sqls[i] + 1;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
export default parserSyntax;
|
@ -1,81 +0,0 @@
|
||||
// import * as sqlSyntaxParser from '../core/sqlSyntaxParser';
|
||||
import hiveSyntaxParser from '../core/parse/hive/hiveSyntaxParser';
|
||||
import hiveAutoCompleteParser from '../core/parse/hive/hiveAutocompleteParser';
|
||||
import impalaSyntaxParser from '../core/parse/impala/impalaSyntaxParser';
|
||||
import impalaAutoCompleteParser from '../core/parse/impala/impalaAutocompleteParser';
|
||||
import genericSyntaxParser from '../core/parse/generic/genericSyntaxParser';
|
||||
import genericAutocompleteParser from '../core/parse/generic/genericAutocompleteParser';
|
||||
import { SyntaxParser, SyntaxResult } from '../core/sqlSyntaxParser';
|
||||
import { CompleteParser, CompleteResult } from '../core/sqlAutoCompleteParser';
|
||||
|
||||
function getSyntaxParser (type: sqlType): any {
|
||||
switch (type) {
|
||||
case sqlType.Hive: {
|
||||
return hiveSyntaxParser;
|
||||
}
|
||||
case sqlType.Impala: {
|
||||
return impalaSyntaxParser;
|
||||
}
|
||||
case sqlType.None: {
|
||||
return genericSyntaxParser;
|
||||
}
|
||||
default: {
|
||||
return hiveSyntaxParser;
|
||||
}
|
||||
}
|
||||
}
|
||||
function getAutoCompleteParser (type: sqlType): any {
|
||||
switch (type) {
|
||||
case sqlType.Hive: {
|
||||
return hiveAutoCompleteParser;
|
||||
}
|
||||
case sqlType.Impala: {
|
||||
return impalaAutoCompleteParser;
|
||||
}
|
||||
case sqlType.None: {
|
||||
return genericAutocompleteParser;
|
||||
}
|
||||
default: {
|
||||
return hiveAutoCompleteParser;
|
||||
}
|
||||
}
|
||||
}
|
||||
enum sqlType {
|
||||
Hive = 'hive',
|
||||
None = 'sql',
|
||||
Impala = 'impala'
|
||||
}
|
||||
function sqlToParserArgs (sql: sql) {
|
||||
let preSql = '', sufSql = '';
|
||||
if(Object.prototype.toString.call(sql) == '[object Array]'){
|
||||
preSql=sql[0];
|
||||
sufSql=sql[1];
|
||||
} else {
|
||||
preSql = sql as string;
|
||||
}
|
||||
return [preSql, sufSql];
|
||||
}
|
||||
/**
|
||||
* 校验语法
|
||||
*/
|
||||
function parseSyntax(sql: sql, type:sqlType = sqlType.Hive): SyntaxResult | false {
|
||||
const parserArgs = sqlToParserArgs(sql);
|
||||
console.log(
|
||||
getSyntaxParser(type)
|
||||
)
|
||||
return (getSyntaxParser(type) as SyntaxParser).parseSyntax(parserArgs[0], parserArgs[1], type, false)
|
||||
}
|
||||
|
||||
/**
|
||||
* 自动补全提示
|
||||
*/
|
||||
function parserSql(sql: sql, type: sqlType = sqlType.Hive): CompleteResult {
|
||||
const parserArgs = sqlToParserArgs(sql);
|
||||
return (getAutoCompleteParser(type) as CompleteParser).parseSql(parserArgs[0], parserArgs[1], type, false)
|
||||
}
|
||||
|
||||
export {
|
||||
parseSyntax,
|
||||
parserSql,
|
||||
sqlType
|
||||
}
|
Reference in New Issue
Block a user