Atitit.sql ast 表明式 语法树 语法 解析原理与落实 java php c#.net js python

 

2.一. lexer当做三个工具,完毕了对SQL字符串的切割,将讲话转化成一个tokens数组。三

Atitit.sql ast 表明式 语法树 语法 解析原理与贯彻 java php c#.net js python

1.一. Sql语法树 ast 如下图锁死1

2.2. Parser成功了SQL解析的后序部分:使用三个lexer对象作为工具,切出tokens,然后解析语义,绑定相关的系统接口。三

二.一. lexer看成二个工具,完成了对SQL字符串的切割,将讲话转化成叁个tokens数组。

 

1.1. Sql语法树 ast 如下图锁死

 

图片 1

 

图片 2

 

图片 3

 

 

3. 参考6

2. SQL语句解析的笔触和进度

贰.三. 关全面据和XML数据库下其抽象语法树分别为: 如图

对此查询语句select name from Name where person_id =一和for $i in doc(“Name.xml”) where $i/person/id=一 return $i/person/name其在关周密据和XML数据库下其抽象语法树分别为:

图片 4 (图1:select name from Name where person_id=一 的空洞语法树)

 

 

图片 5 (图贰:for $i in doc(“Name.xml”) where $i/person/id=1 return $i/person/name的肤浅语法树)

 

二.二. Parser成功了SQL解析的后序部分:使用3个lexer对象作为工具,切出tokens,然后解析语义,绑定相关的种类接口。

小编:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙,  EMAIL:14665一玖八三九@qq.com

转发请评释来源: http://www.cnblogs.com/attilax/

 

在此处先要回想下simpledb的支撑的SQL的语法,那几个影响了它在解析字符串时利用的诀窍。

由代码和地点的语法树看出来,simpledb在解析SQL语句的时候,严刻依照语法中援救的花色,“卡住”关键字,从中解析出字段列表田野先生list,表名列表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*()来检查测试下3个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、田野先生list的营造,使用了递归的章程贯彻:

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. SQL语句解析的思路和进度叁

3. 参考

 

据他们说AST抽象语法树的SQL注入检查实验 (一) – 百科学和教育程网_经历分享平台[学习吗经验教程频道].html

再读simpledb 之 SQL语句解析(二) – 郝玉琨 – 新浪.html

从Oracle到SQL Server-SQL智能翻译器-Oracle-第10城市.html

Query Lanaguage On NoSQL..html

SQLite教程 – 查询处理及优化 – SQLite – 数据库技术 – 玖SSSD.COM.html

SQLite教程 – 浅析Lemon – SQLite – 数据库技术 – 九SSSD.COM.html

Hive SQL 编译进度详解 – OPEN 开发经历库.html (imp

 

二.3. 关周详据和XML数据库下其抽象语法树分别为: 如图 5

相关文章