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构建相关推荐

  1. SQL的语法与分类,语法示例+图片,贼吉尔详细!!!

    SQL通用语法 SQL语句可以单行或多行书写,以分号结尾 SQL语句可以用空格/缩进来增强语句的可读性 MySQL数据库的SQL语句不区分大小写.关键字(建议使用大写) 注释: ​ 单行注释: --注 ...

  2. SQL Server 基础语句知识,语法结构。

    一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...

  3. Database之SQL:自定义创建数据库的各种表demo集合(以方便理解和分析sql的各种增删改查语法的具体用法)

    Database之SQL:自定义创建数据库的各种表demo集合(以方便理解和分析sql的各种增删改查语法的具体用法) 目录 自定义创建数据库的各种表demo集合 具体案例 1.学生信息数据表案例

  4. 基于Python实现的类Pascal语言的词法分析和语法分析器

    类Pascal语言的语法分析器 功能 使用Python实现的类Pascal语言的词法分析和语法分析器. 语法分析实现的功能有: 利用文法推导式构造LR(1)分析表 使用LR(1)分析表对输入的Toke ...

  5. SQL语句多表关联查询语法

    **sql语句多表关联查询语法** 一.外连接 1.左连接 left join 或 left outer join SQL语句:select * from student left join scor ...

  6. 第十一章 SQL隐式联接(箭头语法)

    文章目录 第十一章 SQL隐式联接(箭头语法) 属性引用 子表引用 箭头语法权限 第十一章 SQL隐式联接(箭头语法) InterSystems SQL提供了一个特殊的–>运算符,作为从相关表中 ...

  7. SQL update select语句

    SQL update select语句 最常用的update语法是: UPDATE <table_name> SET <column_name1> = <value> ...

  8. SQL update select结合语句详解及应用

    SQL update select语句 最常用的update语法是: 1 2 UPDATETABLE_NAME SET column_name1 =VALUE WHRER column_name2 = ...

  9. 【转载】SQL update select结合语句详解及应用

    最常用的update语法是: 1 2 UPDATE TABLE_NAME SET column_name1 = VALUE WHRER column_name2 = VALUE 如果我的更新值Valu ...

  10. 关于My Sql update语句不能用子查询的解决办法

    在使用My Sql数据库语法操作update时,第一时间想到的是一下写法: UPDATE purchase_request_detail SET convert_to_voucher_id=2, co ...

最新文章

  1. 常用C/C++开源库
  2. assimp为什么获得一个黑色的图形_论文图形数据获取工具: Web Plot Digitizer应用详解...
  3. js将文字填充与canvas画布再转为图片
  4. 断言assert使用方法
  5. python增量更新数据_Python标准库——加密
  6. java中qualifier注解怎么写_Java 注解 Qualifier
  7. 洛谷P2278操作系统
  8. 随想录(软件中的bug)
  9. Dart云平台-DartPad
  10. [bzoj1008][HNOI2008]越狱-题解[简单组合数学]
  11. 2021-06-0贪吃蛇练习
  12. 【已解决】戴尔笔记本电脑的卡顿问题.
  13. linux命令行 teamview,linux centos 命令行 安装 teamviewer 启动 停止
  14. Mac 打开大小写切换很慢
  15. 【从嵌入式视角学习香山处理器】一、如何开始?(开发环境搭建)
  16. 2013年US News全美综合大学排名(全)
  17. word邮件合并,批量插入图片,批量修改文件名字
  18. win7建WLAN热点
  19. java面试模拟场景,迈向高级的Java面试突围课
  20. 一天设计100张海报?so easy

热门文章

  1. 参考官方mysql自定义一个mysql sink connector
  2. NOI.AC NOIP2018 全国热身赛 第四场
  3. 13、OSPF配置实验之LSA2
  4. Cocos2d-x 设置竖屏的方法 2.0以上版本
  5. 分享自己喜欢的无损高音质音乐给大家
  6. 超链接显示网站 A,访问后进入网站 B
  7. psql 命令行使用
  8. Android应用app数据请求捕捉三步走
  9. 甲骨文创始人埃里森的10大混蛋行为:曾翻微软垃圾堆
  10. 构建Flex应用的10大误区