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:[email protected]

转载请注明来源: 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"

}

时间: 2024-12-25 06:15:43

atitit..sql update语法的词法分析,与语法ast构建的相关文章

Atitit.sql&#160;ast&#160;表达式&#160;语法树&#160;语法&#160;解析原理与实现&#160;java&#160;php&#160;c#.net&#160;js&#160;python

Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python 1.1. Sql语法树 ast 如下图锁死1 2. SQL语句解析的思路和过程3 2.1. lexer作为一个工具,完成了对SQL字符串的切割,将语句转化成一个tokens数组.3 2.2. Parser完成了SQL解析的后序部分:使用一个lexer对象作为工具,切出tokens,然后解析语义,绑定相关的系统接口.3 2.3. 关系数据和XML数据库下其抽象语法树分别为: 如图

SQL UPDATE 语句:更新表中的记录语法及案例剖析

SQL UPDATE 语句 UPDATE 语句用于更新表中的记录. SQL UPDATE 语句 UPDATE 语句用于更新表中已存在的记录. SQL UPDATE 语法 UPDATE table_name SET column1=value1,column2=value2,... WHERE some_column=some_value; 请注意 SQL UPDATE 语句中的 WHERE 子句! WHERE 子句规定哪条记录或者哪些记录需要更新.如果您省略了 WHERE 子句,所有的记录都将被

DAL中的一句sql总是提示&#39;@pagesize&#39;附近有语法错误。

我的页面一运行就提示'@pagesize' 附近有语法错误.但是我在数据库里直接查询,把那些参数替换掉就OK,这句SQL我不知道到底错在哪里 C# code string sql = "select top @pagesize from member where userid not in(select top(@pagesize*(@pagecount-1)) userid from member order by userid) order by userid"; --------

sql update set from 的用法 (转)

关键字: update set from 下面是这样一个例子: 两个表a.b,想使b中的memo字段值等于a表中对应id的name值     表a:id, name               1       王               2       李               3       张     表b:id,ClientName               1                     2               3   (MS SQL Server)语句:

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

来源:http://www.aimks.com/sql-update-the-select-statement-application.html QL update select语句 最常用的update语法是: UPDATE TABLE_NAME SET column_name1 = VALUE WHRER column_name2 = VALUE 如果我的更新值Value是从一条select语句拿出来,而且有很多列的话,用这种语法就很麻烦 第一,要select出来放在临时变量上,有很多个很难

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

最常用的update语法是: 1 2 UPDATE TABLE_NAME SET column_name1 = VALUE WHRER column_name2 = VALUE 如果我的更新值Value是从一条select语句拿出来,而且有很多列的话,用这种语法就很麻烦 第一,要select出来放在临时变量上,有很多个很难保存. 第二,再将变量进行赋值. 列多起来非常麻烦,能不能像Insert那样,把整个Select语句的结果进行插入呢? 就好象下面:: 1 2 3 INSERT INTO ta

SQL-W3School:SQL UPDATE 语句

ylbtech-SQL-W3School:SQL UPDATE 语句 1.返回顶部 1. Update 语句 Update 语句用于修改表中的数据. 语法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 Person: LastName FirstName Address City Gates Bill Xuanwumen 10 Beijing Wilson   Champs-Elysees   更新某一行中的一个列 我们为 lastname 是 "Wilson&

sql update小结

以前update用的不少,但都是简单的单表操作,没有在意,最近查阅多表关联更新及更新top n,发现update还真灵活,记录如下(在mssqlserver2008r2下测试通过): 1单表操作  update table1 set col1=val[,col2=val2...] [where 条件表达式] 2多表关联操作 1)update 表名 set 列名 from 表1,表2 where 条件,此法源表(table1)不能用as别名,长表名很麻烦,如下: update table1 set

如何判断一条sql(update,delete)语句是否执行成功

如何判断一条sql(update,delete)语句是否执行成功 catch  (SQLException    e)  {  }  catch不到错误应该就成功了.   ===================================================================== Statement对象提供了三种执行sql语句的方法.  1.ResultSet  executeQuery(String  sql)       执行查询语句,如ResultSet  r