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());

;

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构建的更多相关文章

  1. 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 ...

  2. (转)ON DUPLICATE KEY UPDATE --mysql的一个有趣语法

    转自:http://my.oschina.net/iceman/blog/53735?fromerr=3kAEPcQr 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE, ...

  3. Atitit sql执行计划

    Atitit sql执行计划 1.1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的 Oracle中的执行计划 ...

  4. SQL update select

    SQL update select语句 最常用的update语法是: UPDATE TABLE_NAME SET column_name1 = VALUE WHRER column_name2 = V ...

  5. SQL Update 语句详解

    SQL Update 语句详解   Update 语句 Update 语句用于修改表中的数据. 语法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 Person: L ...

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

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

  7. 170823、SQL Update多表联合更新的方法

    SQL Update多表联合更新的方法 (1) sqlite 多表更新方法 update t1 set col1=t2.col1 from table1 t1 inner join table2 t2 ...

  8. sql update set from 的用法 (转)

    关键字: update set from 下面是这样一个例子: 两个表a.b,想使b中的memo字段值等于a表中对应id的name值     表a:id, name               1   ...

  9. SQL update select语句

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

随机推荐

  1. Entity Framework7 入门之全功能.NET(Console, WinForms, WPF等)使用EF7

    昨天,我们介绍了EF的新特性和开发计划,如果你还不了解,请移步 Entity Framework7 有哪些不同?现在开发到什么程度了? .今天,我们开学习全功能.NET(Full .NET)下使用EF ...

  2. 简单的python2.7基于bs4和requests的爬虫

    python的编码问题比较恶心. decode解码encode编码 在文件头设置 # -*- coding: utf-8 -*-让python使用utf8. # -*- coding: utf- -* ...

  3. iOS:CoreData数据库的使用一(创建单个数据库表)

    CoreData数据库框架:mac系统自带的数据库,它是苹果公司对sqlite进行封装而来的,既提供了对数据库的主要操作,也提供了具体的视图关系模型. 需要用到三个对象: 1•Managed Obje ...

  4. Fisheye projections from spherical maps [转]

    Fisheye projections from spherical maps Written by Paul Bourke May 2003, software updated January 20 ...

  5. unity 统一替换shader

    camera.SetReplacementShader(shader,"tag"); 可以切了测试性能

  6. 我的Mac必备软件

    1.Svn工具: Cornerstone_v2.7.10 2.iPhone配置文件管理 iPhoneConfigUtility.dmg 3.有道 for mac http://cidian.youda ...

  7. 再谈Cognos利用FM模型来做同比环比

    很早之前已经讲过 <Cognos利用DMR模型开发同比环比>这篇文章里说的是不利用过滤器,而是采用 except (lastPeriods (-9000,[订单数据分析].[日期维度].[ ...

  8. SSIS无法在unicode和非unicode 字符串数据类型之间转换

    场景:SSIS从oracle抽到sqlserver,一个表对表到数据仓库ODS层的抽取,没有任何逻辑结果遇到问题: SSIS无法在unicode和非unicode 字符串数据类型之间转换 如下图2个字 ...

  9. Qt 之 入门例程

    以 “Hello Qt” 为例,介绍如何建立一个 Qt 工程 . 1  QLabel 例程 QLabel 用来显示文本和图片,它继承自 QFrame (而 QFrame 继承自 QWidget) 1. ...

  10. cocos2d-x eclipse + NDK 自动编译配置

    文章来自:http://www.cocos2dres.com/view.asp?id=90 1. 准备工作: android NDK    r8版本 ADT Bundle 下载地址:http://de ...