refactor: unify the parser generator to antlr4

This commit is contained in:
xiaowei
2020-08-28 13:29:11 +08:00
parent 534e42ee63
commit c069f9f714
245 changed files with 414915 additions and 155437 deletions

View File

@ -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
}

View File

@ -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;

View File

@ -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
}