atitit..sql update语法的词法分析,与语法ast构建
atitit..sql update语法的词法分析,与语法ast构建
1. 要使用sql udpate语法的dsl ,需要写个解释器。。 1
2. 词法分析的实现 1
2.1. 扫描器的实现 SqlUpExpTokener 1
2.2. 等号操作符的转态 EqxState 2
2.3. 单引号的转态 SingleQuoeState 3
2.4. 逗号操作的转态 CommaState 5
3. 构建语法树ast 6
4. 最终输出ast结构 8
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());
int n = 0;
while (!(context.state instanceof FinishState)) {
// System.out.println(n);
// ����
context.request(s);
n++;
if (n > 200)
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
if( nextAlsoSq(ctt) && ctt. SingleQuoeCount%2==0 )
{
ctt.curToken.value=ctt.curToken.value+new StringBuffer().append(curchar).toString();
ctt.curcharIndex++;
return;
}
else if( preAlsoSq(ctt) && ctt. SingleQuoeCount%2==1 )
{
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) {
if( ctt.charArr[ctt.curcharIndex-1]=='\'')
return true;
else
return false;
}
/**
@author attilax 老哇的爪子
* @param ctt
@since p2g m_c_s
*/
private boolean nextAlsoSq(Context4sqlUpExp ctt) {
try {
if( ctt.charArr[ctt.curcharIndex+1]=='\'')
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();
ctt. SingleQuoeCount=0;
}
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(JSONObject.fromObject(clt.astRoot).toString(10));
//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;
// ����
for (int i = 0; i < tokenList.size(); i++) {
Token tk = tokenList.get(i);
if (tk.value.equals(",") ) {
Token key = tokenList.get(i - 3);
this.astRoot.put(key.value, tokenList.get(i - 1).value);
}
if( i==tokenList.size()-1 )
{
this.astRoot.put(tokenList.get(i - 2).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构建相关推荐
- SQL的语法与分类,语法示例+图片,贼吉尔详细!!!
SQL通用语法 SQL语句可以单行或多行书写,以分号结尾 SQL语句可以用空格/缩进来增强语句的可读性 MySQL数据库的SQL语句不区分大小写.关键字(建议使用大写) 注释: 单行注释: --注 ...
- SQL Server 基础语句知识,语法结构。
一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...
- Database之SQL:自定义创建数据库的各种表demo集合(以方便理解和分析sql的各种增删改查语法的具体用法)
Database之SQL:自定义创建数据库的各种表demo集合(以方便理解和分析sql的各种增删改查语法的具体用法) 目录 自定义创建数据库的各种表demo集合 具体案例 1.学生信息数据表案例
- 基于Python实现的类Pascal语言的词法分析和语法分析器
类Pascal语言的语法分析器 功能 使用Python实现的类Pascal语言的词法分析和语法分析器. 语法分析实现的功能有: 利用文法推导式构造LR(1)分析表 使用LR(1)分析表对输入的Toke ...
- SQL语句多表关联查询语法
**sql语句多表关联查询语法** 一.外连接 1.左连接 left join 或 left outer join SQL语句:select * from student left join scor ...
- 第十一章 SQL隐式联接(箭头语法)
文章目录 第十一章 SQL隐式联接(箭头语法) 属性引用 子表引用 箭头语法权限 第十一章 SQL隐式联接(箭头语法) InterSystems SQL提供了一个特殊的–>运算符,作为从相关表中 ...
- SQL update select语句
SQL update select语句 最常用的update语法是: UPDATE <table_name> SET <column_name1> = <value> ...
- SQL update select结合语句详解及应用
SQL update select语句 最常用的update语法是: 1 2 UPDATETABLE_NAME SET column_name1 =VALUE WHRER column_name2 = ...
- 【转载】SQL update select结合语句详解及应用
最常用的update语法是: 1 2 UPDATE TABLE_NAME SET column_name1 = VALUE WHRER column_name2 = VALUE 如果我的更新值Valu ...
- 关于My Sql update语句不能用子查询的解决办法
在使用My Sql数据库语法操作update时,第一时间想到的是一下写法: UPDATE purchase_request_detail SET convert_to_voucher_id=2, co ...
最新文章
- 常用C/C++开源库
- assimp为什么获得一个黑色的图形_论文图形数据获取工具: Web Plot Digitizer应用详解...
- js将文字填充与canvas画布再转为图片
- 断言assert使用方法
- python增量更新数据_Python标准库——加密
- java中qualifier注解怎么写_Java 注解 Qualifier
- 洛谷P2278操作系统
- 随想录(软件中的bug)
- Dart云平台-DartPad
- [bzoj1008][HNOI2008]越狱-题解[简单组合数学]
- 2021-06-0贪吃蛇练习
- 【已解决】戴尔笔记本电脑的卡顿问题.
- linux命令行 teamview,linux centos 命令行 安装 teamviewer 启动 停止
- Mac 打开大小写切换很慢
- 【从嵌入式视角学习香山处理器】一、如何开始?(开发环境搭建)
- 2013年US News全美综合大学排名(全)
- word邮件合并,批量插入图片,批量修改文件名字
- win7建WLAN热点
- java面试模拟场景,迈向高级的Java面试突围课
- 一天设计100张海报?so easy