bison 编译sql的基本知识

一。bison是干什么的?

bison 是一个语法分析器,把用户输入的内容,根绝在.y文件中事先定义好的规则,构建一课语法分析树。(所谓的规则就是,匹配上对应字符之后,执行相应的动作。)

1.一个简单的语法例子和分析:

statement :NAME ‘=‘ expression

expression :NUMBER ‘+‘ NUMBER

      |NUMBER ‘-‘ NUMBER

这个语法的意思是:

冒号(:)用来间隔一条规则的左边和右边。

statement  等价于   NAME ‘=‘ expression   。

由于在语法中规定大写字母 和引号的内容为终结符,所以NAME ‘=‘ 两个字符不再有含义,已经终结。

但是expression   是非终结符,根据第二行的规定,expression 又等价为 两个数的加法或者两个数的减法。其中竖线(|)表示一个语法符号有两种等价方式。 NUMBER ‘+‘ NUMBER   NUMBER ‘-‘ NUMBER均是终结符,所以语法解析结束。

假如现在的输入是fred=12+13.  则语法解析树如下:(圆形都是非终结符,矩形都是终结符)

2.移进 规约分析

当bison处理一个语法分析树时,会创建一组状态,每个状态对应一个或者多个分析过的规则中的可能的位置。当读到的记号不足以结束一条规则的时候,就会把这个记号压入一个内部堆栈,然后切换到新状态,这个过程叫做移进。当压入栈内的所有的语法符号已经等价于一个规则的右部时,就把这些符号全部弹出,把规则的左部压入栈。这个过程叫做规约。

下面是一个例子:

fred=12+13

语法分析器一次移进一个记号。

堆栈:

fred

fred =

fred =12

fred=12 +

fred =12+13                 把12+13 规约成expression,12+13弹出,expression压入

fred = expression     把fred = expression规约成statement   fred = expression弹出,statement压入

statement

3.sql语言中的语法解析过程。(以select为例)

首先,需要一个词法分析器来识别SQL中的所有关键字。

程序的运行流程:(以select为例)

1.用户输入sql语句,调用sql.tab.c中的解析函数,得到select_statement的状态。(。y文件中为sql语句定义了好多个状态。)

2.select_statement作为参数,去匹配规则,并执行相应的动作,即构建一课语法树。这个匹配的过程由yyparse()库函数来完成!

下面这段代码是.y文件中,定义的关于select_statement部分的代码:

select_statement:
    SELECT selection table_exp
    {
        struct stnode * p = create_non_terminal_node("select_section");

        if(!p)
        {
            printf("error:create_non_terminal_node\n");

            return 1;
        }

        if(!append_child(p, $1))
        {
            printf("error:append_child\n");

            return 1;
        }

        if(!append_child(p, $2))
        {
            printf("error:append_child\n");

            return 1;
        }

        if(!append_child(p, $3))
        {
            printf("error:append_child\n");

            return 1;
        }        

        $$ = p;
    }
selection:
    scalar_exp_list
    {
        struct stnode * p = create_non_terminal_node("selection");

        if(!p)
        {
            printf("error:create_non_terminal_node\n");

            return 1;
        }

        if(!append_child(p, $1))
        {
            printf("error:append_child\n");

            return 1;
        }

        $$ = p;
    }
    | ‘*‘
    {
        struct stnode * p = create_non_terminal_node("selection");

        if(!p)
        {
            printf("error:create_non_terminal_node\n");

            return 1;
        }

        if(!append_child(p, $1))
        {
            printf("error:append_child\n");

            return 1;
        }

        $$ = p;
    }
    ;
scalar_exp_list:
    scalar_exp
    {
        struct stnode * p = create_non_terminal_node("scalar_exp_list");

        if(!p)
        {
            printf("error:create_non_terminal_node\n");

            return 1;
        }

        if(!append_child(p, $1))
        {
            printf("error:append_child\n");

            return 1;
        }

        $$ = p;
    }
    | scalar_exp_list‘,‘scalar_exp
    {
        struct stnode * p = create_non_terminal_node("scalar_exp_list");

        if(!p)
        {
            printf("error:create_non_terminal_node\n");

            return 1;
        }

        if(!append_child(p, $1))
        {
            printf("error:append_child\n");

            return 1;
        }

        if(!append_child(p, $2))
        {
            printf("error:append_child\n");

            return 1;
        }

        if(!append_child(p, $3))
        {
            printf("error:append_child\n");

            return 1;
        }

        $$ = p;
    }
    ;
table_exp:
    from_clause
    opt_order_by_clause
    {
        struct stnode * p = create_non_terminal_node("table_exp");

        if(!p)
        {
            printf("error:create_non_terminal_node\n");

            return 1;
        }

        if(!append_child(p, $1))
        {
            printf("error:append_child\n");

            return 1;
        }

        if(!append_child(p, $2))
        {
            printf("error:append_child\n");

            return 1;
        }

        $$ = p;
    }
    ;
from_clause:
    FROM table_ref_list opt_where_clause
    {
        struct stnode * p = create_non_terminal_node("from_clause");

        if(!p)
        {
            printf("error:create_non_terminal_node\n");

            return 1;
        }

        if(!append_child(p, $1))
        {
            printf("error:append_child\n");

            return 1;
        }

        if(!append_child(p, $2))
        {
            printf("error:append_child\n");

            return 1;
        }

        if(!append_child(p, $3))
        {
            printf("error:append_child\n");

            return 1;
        }

        $$ = p;
    }
    ;

table_ref_list:
    table_ref
    {
        struct stnode * p = create_non_terminal_node("table_ref_list");

        if(!p)
        {
            printf("error:create_non_terminal_node\n");

            return 1;
        }

        if(!append_child(p, $1))
        {
            printf("error:append_child\n");

            return 1;
        }

        $$ = p;
    }
    | table_ref_list‘,‘table_ref
    {
        struct stnode * p = create_non_terminal_node("table_ref_list");

        if(!p)
        {
            printf("error:create_non_terminal_node\n");

            return 1;
        }

        if(!append_child(p, $1))
        {
            printf("error:append_child\n");

            return 1;
        }

        if(!append_child(p, $2))
        {
            printf("error:append_child\n");

            return 1;
        }

        if(!append_child(p, $3))
        {
            printf("error:append_child\n");

            return 1;
        }

        $$ = p;
    }
    ;
table_ref:
    table
    {
        struct stnode * p = create_non_terminal_node("table_ref");

        if(!p)
        {
            printf("error:create_non_terminal_node\n");

            return 1;
        }

        if(!append_child(p, $1))
        {
            printf("error:append_child\n");

            return 1;
        }

        $$ = p;
    }
    ;

3.根据上面代码中的定义的规则,,,,展示下面的语法树的构建过程:

规则                                                                                                   动作:                                                                    语法树

select_statement  :  SELECT selection table_exp                           node("select_section")                                                  select_statement

                                                                                        SELECT             selection              table_exp

selection  :  scalar_exp_list                                                          node("selection")                                                                   *

|*

table_exp   :   from_clause       opt_order_by_clause                      node("table_exp")                                                                                from_clause             opt_order_by_clause 

from_clause:    FROM table_ref_list opt_where_clause                     node("from_clause")                                                      FROM            table_ref_list     opt_where_clause

table_ref_list  :table_ref   

                    | table_ref_list‘,‘table_ref                                         node("table_ref_list  ")                                                                          table_ref  

table_ref: table                                                                            node("table ")                                                                                         table

时间: 2024-10-06 09:57:23

bison 编译sql的基本知识的相关文章

SQL Server基础知识

查看sql server版本 select @@VERSION 基本操作 use tty; 使用tty数据库 create table tt(name varchar(10)); 新建表tt insert into tt values('ftp'); 插入数据ftp select * from tt; 查看表tt delete from tt; 删除表表tt中的一条记录 运行命令的快捷方式: Alt+x 重启数据库服务 net restart mssqlserver 修改用户密码 企业管理器——

SQL数据库基础知识-巩固篇<一>

SQL数据库基础知识-巩固篇<一>... 首先展示两款我个人很喜欢的数据库-专用于平时个人SQL技术的练习<特点:体积小,好安装和好卸载,功能完全够用了> MySQL-57 DataBase MS-SQLServer-2000 DataBase SQL的含义:结构化查询语言(Structured Query Language)简称SQL 作用:SQL(Structured Query Language,结构化查询语言)是一种用于操作数据库的语言. 结构化查询语言包含6个部分:一:数

SQL语句之 知识补充

SQL语句之 知识补充 一.存储过程 运用SQL语句,写出一个像函数的模块,这就是存储过程. 需求: 编写存储过程,查询所有员工 -- 创建存储过程(必须要指定结束符号) -- 定义结束符号 DELIMITER $ CREATE PROCEDURE pro_test() BEGIN SELECT * FROM student; END $ CALL pro_test     -- 调用存储过程 创建存储语句: delimiter 结束符号 create procedure 存储过程名称( 参数列

SQL Server 索引知识-应用,维护

创建聚集索引 a索引键最好唯一(如果不唯一会隐形建立uniquier列(4字节)确保唯一,也就是这列都会复制到所有非聚集索引中) b聚集索引列所占空间应尽量小(否则也会使非聚集索引的空间变大) c聚集索引应固定,不能随便改动(否则会引起分页,碎片,非聚集索引被迫修改等一些列问题) d聚集索引键一般与主键(primary key)分开(基于方便业务调整,如业务逻辑存储数据与clustered index key一致且不会改变,则主键可为聚集索引) 应用实例: 选择聚集键时,尽量避免因插入引起的分页

SQL Server 索引知识-概念

概念篇 索引概念(index concept) 一种表或视图中相关的B-tree的数据结构.索引键列由一列或多列组成.可拥有包含性列(sql2005).用于提升Sql Server 查找相关数据行效率. 聚集索引(Clustered index) 表或索引视图数据行按照聚集索引键排序.每个表只能有一个聚集索引(聚集表中数据只能按一种方式组织).表中有聚集索引则表称为聚集索引表,无聚集索引则称为堆表. 非聚集索引(Nonclustered index) 独立于数据行之外的一种数据结构.用于快速检索

SQL server基础知识(表操作、数据约束、多表链接查询)

SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database 数据库名称 查询:select name from master..sysdatabases 修改:alter database 数据库名称(在 sql server 中修改与数据库关联的文件和文件组.在数据库中添加或删除文件和文件组.更改数据库或其文件和文件组的属性) (3).管理表 选择数据库:use 数

SQL Server2005基础知识(created by one friend)

1 -- 创建表book的Transact-SQL语句: 2 create database test01 3 create table test01.dbo.book( 4 book_id nchar(6) not null, 5 book_name nchar(30) null, 6 price numeric(10,2) null, 7 constraint PK_book primary key clustered(book_id asc)--建立主键 8 )on [primary] 9

java预编译SQL和参数替换 更新&#183;&#183;&#183;&#183;PSF

原文:java预编译SQL和参数替换 更新····PSF 源代码下载地址:http://www.zuidaima.com/share/1550463668718592.htm 功能为将项目中输出的预编译SQL语句,转换为带实际参数的SQL语句. 代码为javaSwing,启动类为AppStart.java. 界面如下图:

hibernate预编译SQL语句中的setParameter和setParameterList

使用预编译SQL语句和占位符参数(在jdbc中是?),能够避免因为使用字符串拼接sql语句带来的复杂性.我们先来简单的看下,使用预编译SQL语句的好处.使用String sql = "select * from Student where name=" + name;如果name的值是1或 "aty"或"aty'aty",就会产生下面错误的sql --ORA-01722 invalid number select * from student w