Published: 2019-05-25 21:18:00
tags: Flink
语法分析生成器
-- JavaCC
介绍:JavaCC是一个词法分析生成器和语法分析生成器
TOP-DOWN:JavaCC产生自顶向下的语法分析器,而YACC等工具则产生的是自底向上的语法分析器。做词法分析
输入文件是一个词法和语法的规范文件.jj,文件中词法和语法规则都写在其中
在PARSER_BEGIN和PARSER_END之间定义语法解析器的主类,这是整个解析程序的入口,
里面主要有一些引用的包和类以及一个main方法(其他的方法由JavaCC生成
Apache Calcite是一个动态数据管理框架,它具备很多典型数据库管理系统的功能,比如SQL 解析、SQL校验、SQL查询优化、SQL生成以及数据连接查询等,基于JavaCC。
-- ANTLR(ANother Tool for Language Recognition)
两种遍历树的机制:
监听器 Listener extends BaseErrorListener extends SqlBaseBaseListener
访问器 Vistor pattern
SQL解析器
01.JSqlParser It is built using JavaCC
net.sf.jsqlparser.parser.CCJSqlParserUtil
The method CCJSqlParserManager.parse returns a class implementing Statement
which can be used to navigate the structure representing the SQL statement
Jsqlparser对SQL的遍历采用了 VISITOR 模式, 遍历SQL语句比较方便
应用场景: 状态过滤、权限过滤,表和字段血缘管理
02. Apache Calcite是一个动态数据管理框架,它具备很多典型数据库管理系统的功能,比如SQL 解析、SQL校验、SQL查询优化、SQL生成以及数据连接查询等,基于JavaCC。
3. fdb-sql-parser
4. 正则匹配的方法
开发
01.Maven依赖
com.github.jsqlparser
jsqlparser
1.2
02.源码
文件: JSqlParserCC.jjt
/**
* It represents an expression like "(" expression ")"
*/
public class Parenthesis implements Expression {}
public interface Expression {void accept(ExpressionVisitor expressionVisitor);}
/**
* The core of a "SELECT" statement (no UNION, no ORDER BY)
*/
public class PlainSelect implements SelectBody {
public Expression getWhere() {return where;}
……}
public interface SelectBody {void accept(SelectVisitor selectVisitor);}
public class Select implements Statement {}
public interface Statement {void accept(StatementVisitor statementVisitor);}
03.具体概念
Statement SQL语句
Select,Create,Drop,Insert,Delete等,它们作为Statement实现类,均实现accept方法
Expression
ExpressionVisitor
Visitor有StatementVisitor,SelectVisitor,ExpressionVisitor,SelectItemVisitor,FromItemVisitor
CNFConverter :This class handles the conversion from a normal expression tree into the CNF form.
SelectDeParser :
A class to de-parse (that is, tranform from JSqlParser hierarchy into a string)
// de为英语前缀,前缀de-来自拉丁语,意为"away from",de-还表示"除去"、"取消"以及"否定"、"非"、"相反"的意思
其他
Trie树,又叫做前缀树或者是字典树,是一种有序的树
Observer - 观察者模式
Listener - 监听模式
Visitor - 访问者
访问操作独立出来变成一个新的类,当我们需要增加访问操作的时候,直接增加新的类,原来的代码不需要任何的改变。
把结构和数据分开,编写一个访问者,去访问数据结构中的元素,然后把对各元素的处理全部交给访问者类
Visitor 声明visit() ConcreteVisitor 实现visit()
Element 声明accept() ConcreteElement accept方法的实现
ObjectStructure
参考
https://www.programcreek.com/java-api-examples/?class=net.sf.jsqlparser.statement.select.PlainSelect&method=getGroupByColumnReferences
JSqlParser使用示例 https://zacard.net/2016/05/10/JSqlParser-examples/
https://www.programcreek.com/java-api-examples/index.php?api=net.sf.jsqlparser.parser.CCJSqlParserUtil
SQL解析(Jsqlparser) http://itsolife.com/2014/02/02/2014-02-02-JavaJ2EE-SQL_Java--SQL%E8%A7%A3%E6%9E%90Jsqlparser/
jsqlParse分析SQL https://www.jianshu.com/p/988229bb82b7
使用Jsqlparser从复杂SQL语句中提取表名 http://www.findsrc.com/java/detail/8640