在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python
2.1. lexer作为一个工具,完成了对SQL字符串的切割,将语句转化成一个tokens数组。3 2.2. Parser完成了SQL解析的后序部分:使用一个lexer对象作为工具,切出tokens,然后解析语义,绑定相关的系统接口。3 2.3. 关系数据和XML数据库下其抽象语法树分别为: 如图 5
1.1. Sql语法树 ast 如下图锁死
2.1. lexer作为一个工具,完成了对SQL字符串的切割,将语句转化成一个tokens数组。2.2. Parser完成了SQL解析的后序部分:使用一个lexer对象作为工具,切出tokens,然后解析语义,绑定相关的系统接口。作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙, EMAIL:[email protected] 转载请注明来源: http://www.cnblogs.com/attilax/
在这里先要回顾下simpledb的支持的SQL的语法,这个影响了它在解析字符串时使用的方法。 由代码和上面的语法树看出来,simpledb在解析SQL语句的时候,严格按照语法中支持的类型,“卡住”关键字,从中解析出字段列表fieldlist,表名列表tablelist,以及谓词列表predicates,然后将这些查询中实际用到的数据,包装成相应的对象,SQL语句的解析就初步完成
作为SQL语句解析的入口,有如下的updateCMD方法,根据SQL语句首个token的不同,进行了分支: public object updateCmd() { if (lex.matchKeyword("insert")) return insert(); else if (lex.matchKeyword("delete")) return delete(); else if (lex.matchKeyword("update")) return modify(); else return create(); }
补充一点,注意下上面的query()的代码,lex用match*()来检测下一个token是否满足匹配条件,用eat*()来讲满足条件的token处理掉: public void eatDelim(char d); public string eatId(); public int eatIntConstant() public void eatKeyword(string w) public string eatStringConstant() 数据相关的,均有返回值,返回处理后的结果;数据无关的,没有返回值,实际只是利用nextToken移动position指针。 关于tablelist、fieldlist的构建,使用了递归的方式实现: private List<string> fieldList() { List<string> l = new List<string>(); l.Add(field()); if (lex.matchDelim(',')) { lex.eatDelim(','); l.AddRange(fieldList()); } return l; } 谓词 predicates也是用了递归的形式: private Predicate predicate() { Predicate pred = new Predicate(term()); if (lex.matchKeyword("and")) { lex.eatKeyword("and"); pred.conjoinWith(predicate()); } return pred; } 略有不同的是,在谓词连接的时候,使用了Predicate类的conjoinwith方法,实际上,predicate对象下,维护了一个条件列表terms,这个方法就是把谓词中的各个term转存到一起。
本文和前一节只是扼要地描述了SQL语句解析的思路和过程,可以看到解析的结果就是生成了各种查询data,这些data会传递给query模块,由query模块利用这些得到的data,完成数据的查询。
2.3. 关系数据和XML数据库下其抽象语法树分别为: 如图
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论