atitit..sql update语法的词法分析,与语法ast构建
atitit..sql update语法的词法分析,与语法ast构建
1. 要使用sql udpate语法的dsl ,需要写个解释器。。 1
1. 要使用sql udpate语法的dsl ,需要写个解释器。。
主要应用在orm框架上,使得update 跟个insert的语法统一
注意的要点::
单引号的转义实现
单引号内的逗号,等号的实现。
作者:: 老哇的爪子 Attilax 艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://blog.csdn.net/attilax
2. 词法分析的实现
2.1. 扫描器的实现 SqlUpExpTokener
s = "fld1=1,fld2='at''t,lax',fld3='val3'";
public List getTokenList(String s) {
// DslPaserContext context = new DslPaserContext();
Context4sqlUpExp context = new Context4sqlUpExp();
context.setState(new iniState());
;
while (!(context.state instanceof FinishState)) {
// System.out.println(n);
// ����
context.request(s);
n++;
)
break;
}
for (Token tk : context.tokenList) {
// if(tk.value.trim().length()>0)
System.out.println(tk.value + "===");
}
return (List) context.tokenList;
}
2.2. 等号操作符的转态 EqxState
public class EqxState implements State {
@Override
public void handle(String sampleParameter, Context context) {
Context4sqlUpExp ctt = (Context4sqlUpExp) context;
char curchar = ctt.curchar;
if (ctt.lastKeystate instanceof CommaState || ctt.lastKeystate instanceof CommaState || ctt.lastKeystate instanceof com.attilax.dsm.state.iniState) {
Token tk = new Token();
tk.value = ctt.curToken.value.trim();
ctt.tokenList.add(tk);
ctt.tokenList.add(new Token() {
{
this.value = "=";
}
});
ctt.curToken = new Token();
ctt.lastKeystate=new EqxState();
} else
ctt.curToken.value += curchar;
ctt.curcharIndex++;
}
2.3. 单引号的转态 SingleQuoeState
public class SingleQuoeState implements State {
/* (non-Javadoc)
* @see com.attilax.designpatter.statepatter.State#handle(java.lang.String)
*/
@Override
public void handle(String sampleParameter) {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see com.attilax.designpatter.statepatter.State#handle(java.lang.String, com.attilax.designpatter.statepatter.Context)
*/
@Override
public void handle(String sampleParameter, Context context) {
Context4sqlUpExp ctt = (Context4sqlUpExp) context;
char curchar=ctt.curchar;
ctt. SingleQuoeCount++;
// ctt.curToken.value+=curchar;
//sec queot
)
{
ctt.curToken.value=ctt.curToken.value+new StringBuffer().append(curchar).toString();
ctt.curcharIndex++;
return;
}
)
{
ctt.curToken.value=ctt.curToken.value+new StringBuffer().append(curchar).toString();
ctt.curcharIndex++;
return;
}
else if(ctt.lastKeystate instanceof EqxState)
{
ctt.curToken=new Token();
ctt.lastKeystate=new SingleQuoetStartState();
}
else if (ctt.lastKeystate instanceof SingleQuoetStartState )//first queot
{
Token tk=new Token();
tk.value=ctt.curToken.value;
ctt.tokenList.add(tk);
// ctt.tokenList.add(new Token(){{ this.value="," ; }});
ctt.curToken=new Token();
ctt.lastKeystate=new SingleQuoeEndState();
}
ctt.curcharIndex++;
}
/**
@author attilax 老哇的爪子
@since p2g m_n_5
*/
private boolean preAlsoSq(Context4sqlUpExp ctt) {
]=='\'')
return true;
else
return false;
}
/**
@author attilax 老哇的爪子
* @param ctt
@since p2g m_c_s
*/
private boolean nextAlsoSq(Context4sqlUpExp ctt) {
try {
]=='\'')
return true;
else
return false;
} catch (ArrayIndexOutOfBoundsException e) {
return false;
}
}
}
2.4. 逗号操作的转态 CommaState
public void handle(String sampleParameter, Context context) {
Context4sqlUpExp ctt = (Context4sqlUpExp) context;
char curchar = ctt.curchar;
if(ctt.lastKeystate instanceof EqxState )
{
//
Token tk=new Token();
tk.value=ctt.curToken.value.trim();
ctt.tokenList.add(tk);
ctt.tokenList.add(new Token() {
{
this.value = ",";
}
});
ctt.curToken = new Token();
ctt.lastKeystate = new CommaState();
}
else if( ctt.lastKeystate instanceof SingleQuoeEndState)
{
ctt.tokenList.add(new Token() {
{
this.value = ",";
}
});
ctt.curToken = new Token();
ctt.lastKeystate = new CommaState();
;
}
else
{
ctt.curToken.value+=curchar;
}
// ctt.curToken.value+=curchar;
ctt.curcharIndex++;
}
3. 构建语法树ast
这里使用map作为Ast的存储格式。。最终序列化为json
public class AstBuilder {
public Context ctx = new Context();
// ����ı��ʽ
public AbstractExpression expression;
public Map astRoot = new HashMap();
private String expStr;
@SuppressWarnings("all")
public static void main(String[] args) throws CantFindRitBrack {
String expStr2 = " method1( param1;\r\n method2(param2);";
expStr2 = "fld1=1,fld2='at''t,lax',fld3='val3'";
AstBuilder clt = new AstBuilder(expStr2);
clt.tkr = new SqlUpExpTokener();
Object rzt = clt.build();// AST
));
//System.out.println(JsonUtil4jackjson.buildNormalBinder().toJson(rzt));
}
// ���캯������,������
public AstBuilder(String expStr) throws CantFindRitBrack {
this.expStr = expStr;
}
Tokener tkr;
List<Token> tokenList;
private Object build() throws CantFindRitBrack {
tokenList = tkr.getTokenList(this.expStr);
// ����һ����ջ������������Ⱥ�˳��
// Stack<AbstractExpression> stack = ctx.stack;
// ����
; i < tokenList.size(); i++) {
Token tk = tokenList.get(i);
if (tk.value.equals(",") ) {
);
).value);
}
)
{
).value, tokenList.get(i).value);
}
}
return this.astRoot;
// ���������׳���
// this.expression = stack.pop();
}
4. 最终输出ast结构
{
"fld1": "1",
"fld3": "val3",
"fld2": "at''t,lax"
}
atitit..sql update语法的词法分析,与语法ast构建的更多相关文章
- Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python
Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python 1.1. Sql语法树 ast 如下图锁死1 2. SQL语句解析的思路和过程3 ...
- (转)ON DUPLICATE KEY UPDATE --mysql的一个有趣语法
转自:http://my.oschina.net/iceman/blog/53735?fromerr=3kAEPcQr 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE, ...
- Atitit sql执行计划
Atitit sql执行计划 1.1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的 Oracle中的执行计划 ...
- SQL update select
SQL update select语句 最常用的update语法是: UPDATE TABLE_NAME SET column_name1 = VALUE WHRER column_name2 = V ...
- SQL Update 语句详解
SQL Update 语句详解 Update 语句 Update 语句用于修改表中的数据. 语法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 Person: L ...
- SQL update select结合语句详解及应用
QL update select语句 最常用的update语法是: 1 2 UPDATE TABLE_NAME SET column_name1 = VALUE WHRER column_name2 ...
- 170823、SQL Update多表联合更新的方法
SQL Update多表联合更新的方法 (1) sqlite 多表更新方法 update t1 set col1=t2.col1 from table1 t1 inner join table2 t2 ...
- sql update set from 的用法 (转)
关键字: update set from 下面是这样一个例子: 两个表a.b,想使b中的memo字段值等于a表中对应id的name值 表a:id, name 1 ...
- SQL update select语句
SQL update select语句 最常用的update语法是:UPDATE <table_name>SET <column_name1> = <value>, ...
随机推荐
- Linux操作系统的种种集成开发环境
Linux操作系统的种种集成开发环境 随着Linux的逐渐兴起,已经有为数众多的程序在上面驰骋了,许多开发环境(Development Environment)也应运而生.好的开发环境一定是集成了编辑 ...
- 仿LOL项目开发第三天
仿LOL项目开发第二天 by草帽 昨个我们已经实现了下载功能,但是发现没有,下载的包是压缩的,没有解压开,那么Unity是识别不了的. 所以今个我们来讲讲如何实现解压文件. 还记得吗,我们在Downl ...
- easyui icon的使用相关
easyui的默认图标有以下这些: .icon-blank{ background:url('icons/blank.gif') no-repeat; } .icon-add{ background: ...
- python的单元测试框架
1.unittest是Python内置的标准类库.它的API跟Java的JUnit..net的NUnit,C++的CppUnit很相似. 通过继承unittest.TestCase来创建一个测试用 ...
- Windows之权限的继承性 累加性 优先性 交叉性及四项基本原则
Windows NT以后的文件,及文件夹共享设置有以下特性:继承性.累加性.优先性.交叉性. 继承性是说下级的目录在没有经过重新设置之前,是拥有上一级目录权限设置的.这里还有一种情况要说明一下 ...
- 在css加载完毕后执行后续代码
最近在写项目的framework,写个JQueryMessageBox的类,以使用jquery ui中的dialog()来显示消息框,为了使方法方便调用,便加入了自动判断页面是否加入了ui.js和ui ...
- Web开发者需养成的8个好习惯
优秀的Web开发人员工作效率更高,因为他们拥有丰富的经验和良好的习惯.作者Gregor Dorfbauer分享了用于Web开发中的8个好习惯,这些良好的工作习惯不仅能提高效率,还能让您创建更加优秀的应 ...
- 线程本地存储TLS(Thread Local Storage)的原理和实现——分类和原理
本文为线程本地存储TLS系列之分类和原理. 一.TLS简述和分类 我们知道在一个进程中,所有线程是共享同一个地址空间的.所以,如果一个变量是全局的或者是静态的,那么所有线程访问的是同一份,如果某一个线 ...
- IE、火狐导入收藏夹乱码解决方案
IE收藏夹导入Firefox书签后出现乱码的原因在于两个浏览器的收藏夹的html文件的编码方式不同,Firefox使用的是UTF-8编码,而IE是ASCII编码.故两者的收藏夹文件互相导入的时候会出现 ...
- 利用 Android 系统原生 API 实现分享功能
利用 Android 系统原生 API 实现分享功能 这篇文章提供一个封装好的 Share2 库供大家参考. GitHub 项目地址:Share2 大家知道,要调用 Android 系统内建的分享功能 ...