西电编译原理上机报告.docx

上传人:b****5 文档编号:7225520 上传时间:2023-01-22 格式:DOCX 页数:38 大小:628.91KB
下载 相关 举报
西电编译原理上机报告.docx_第1页
第1页 / 共38页
西电编译原理上机报告.docx_第2页
第2页 / 共38页
西电编译原理上机报告.docx_第3页
第3页 / 共38页
西电编译原理上机报告.docx_第4页
第4页 / 共38页
西电编译原理上机报告.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

西电编译原理上机报告.docx

《西电编译原理上机报告.docx》由会员分享,可在线阅读,更多相关《西电编译原理上机报告.docx(38页珍藏版)》请在冰豆网上搜索。

西电编译原理上机报告.docx

西电编译原理上机报告

 

编译原理上机报告

 

《DBMS的设计与实现》

 

学号:

姓名:

手机:

邮箱:

 

完成时间:

2013年6月21日

1.

项目概况

1.1基本目标

设计并实现一个DBMS原型系统,可以接受基本的SQL语句,对其进行词法分析、语法分析,然后解释执行SQL语句,完成对数据库文件的相应操作,实现DBMS的基本功能。

1.2完成情况

1.CREATEDATABASE创建数据库

2.SHOWDATABASES显示数据库名

3.DROPDATABASE删除数据库

4.USEDATABASE选择数据库

5.CREATETABLE创建表

6.SHOWTABLES显示表名

7.DROPTABLE删除表

8.INSERT插入元组

9.SELECT查询元组

10.DELETE删除元组

11.UPDATE更新元组

12.EXIT退出系统

2.

项目实现方案

2.1逻辑结构与物理结构

1.逻辑结构

(1)系统数据库

1)元数据的逻辑结构

在我设计的系统数据库中,虽然建有元数据的文件,但是文件中没有任何数据,所以元数据的逻辑结构不存在。

2)基本数据的逻辑结构

表1系统数据库的基本数据的逻辑结构

列名

说明

类型

name

数据库的名称

char(20)

dbfile

数据库的元数据文件名称

char(40)

datfile

数据库的基本数据文件名称

char(40)

(2)用户数据库

1)元数据的逻辑结构

由于在我的设计中,为数据库中每个表创建一个基本数据文件,所以不需要ppt中的“起始页”,添加了一个“表中列的数目”的列,如下表所示:

表2用户数据库的元数据的逻辑结构

列名

说明

类型

tname

表的名称

char(20)

col_count

表中列的数目

int(4)

tname

表的名称,与前面的一样

char(20)

col_num

列号

int(4)

col_name

列名

char(10)

col_type

列的类型

int(4)

offset

偏移

int(4)

width

宽度

int(4)

说明:

表中col_type列,取值为整数,1表示字符串,2表示整型

2)基本数据的逻辑结构

与ppt中的参考方案不同的是,对于数据库中的每一个表,我并不是把每个表的基本数据均存放在一个与数据库同名的基本数据文件中,而是为每个表创建一个与表同名的基本数据文件。

因此,基本数据的逻辑结构与每个表的结构有关。

当然,虽然为每个表创建一个与表同名的基本数据文件,但是为了与系统数据库的基本数据相匹配,仍然创建了一个与数据库同名的基本数据文件,只是文件为空,没有逻辑结构。

2.物理结构

所有的数据库文件均存放在名为“mydb”的根文件夹下。

在根文件夹下,创建元数据文件sys.db,创建基本数据文件sys.dat。

当创建一个数据库(如xjgl)时,在根文件夹下创建一个与数据库同名的文件夹(xjgl),在此文件夹下,创建与数据库同名的元数据文件(如xjgl.db),创建与数据库同名的基本数据文件(如xjgl.dat)。

当创建一个表(如student)时,在表所属的数据库的文件夹下,创建表的基本数据文件(student.dat)。

(1)系统数据库

1)元数据的物理结构

在我设计的数据库中,仅仅是在“mydb”根文件夹下创建了一个sys.db文件,但是文件中没有任何数据。

2)基本数据的物理结构

在“mydb”根文件夹下创建了一个sys.dat文件,文件中数据的保存实例如下表:

表3系统数据库的基本数据的物理结构

name

dbfile

datfile

xjgl

xjgl.db

xjgl.dat

(2)用户数据库

1)元数据的物理结构

在每个数据库(如xjgl)的同名文件夹下,创建与数据库同名的元数据文件(如xjgl.db),文件中数据的保存实例如下表:

表4用户数据库的元数据的物理结构

student

3

student

0

sname

1

0

20

student

1

sage

2

20

4

student

2

ssex

2

24

4

course

2

course

0

cname

1

0

20

course

1

cid

2

20

4

cs

2

cs

0

sname

1

0

20

cs

1

cid

2

20

4

2)基本数据的物理结构

在每个数据库(如xjgl)的同名文件夹下,创建与数据库同名的基本数据文件(如xjgl.dat),但是文件中不存放任何表的基本数据。

每个表的基本数据均存放在与表同名的基本数据文件中。

如student表中的基本数据存放在student.dat文件中,course表中的基本数据存放在course.dat文件中,sc表中的基本数据存放在sc.dat文件中,文件中数据的保存实例如下两表:

表5用户数据库的student表的基本数据的物理结构

sname

sage

ssex

zhangsan

22

1

lisi

23

0

wangwu

21

0

zhouliu

22

1

xiaobai

23

0

xiaohei

19

0

表6用户数据库的course表的基本数据的物理结构

cname

cid

db

1

complier

2

c

3

3.优缺点

(1)优点:

一个表对应一个基本数据文件,对表的操作容易理解,文件指针移动不易出错。

(2)缺点:

存在空的文件,浪费存储空间。

2.2语法结构与数据结构

1.CREATEDATABASE语句

(1)产生式语法结构:

create_database:

CREATEDATABASEdatabase';';

非终结符create_database的属性使用如右结构说明:

char*yych;

非终结符database的属性:

database:

ID(字符串)

(2)以实例说明该数据结构:

CREATEDATABASEXJGL;

对应的数据结构如下图所示:

图1数据结构图

2.SHOWDATABASES语句

(1)产生式语法结构:

show_databases:

SHOWDATABASES';';

非终结符show_databases无属性

(2)以实例说明该数据结构:

SHOWDATABASES;

无数据结构

3.DROPDATABASE语句

(1)产生式语法结构:

drop_database:

DROPDATABASEdatabase';';

非终结符drop_database的属性使用如右结构说明:

char*yych;

非终结符database的属性:

database:

ID(字符串)

(2)以实例说明该数据结构:

DROPDATABASEXJGL;

对应的数据结构如下图所示:

图2数据结构图

4.USEDATABASE语句

(1)产生式语法结构:

use_database:

USEdatabase';';

非终结符use_database的属性使用如右结构说明:

char*yych;

非终结符database的属性:

database:

ID(字符串)

(2)以实例说明该数据结构:

USEXJGL;

对应的数据结构如下图所示:

图3数据结构图

5.CREATETABLE语句

(1)产生式语法结构:

createsql:

CREATETABLEtable'('fieldsdefinition')'';';

table:

ID;

fieldsdefinition:

field_type

|fieldsdefinition','field_type;

field_type:

fieldtype;

field:

ID;

type:

CHAR'('NUMBER')'|INT;

非终结符createsql的属性使用如下结构说明:

structCreatestruct{//create语法树根节点

char*table;

structCreatefieldsdef*fdef;

};

非终结符fieldsdefinition与field_type的属性使用如下结构说明:

structCreatefieldsdef{//create语句中的字段定义

char*field;

inttype;

intlength;

structCreatefieldsdef*next_fdef;

};

非终结符type的属性使用如下结构说明:

structType_def{//create语句中的字段的类型定义

inttype;

intlength;

};

(2)以实例说明该数据结构:

CREATETABLEStudent(SnameCHAR(20),SageINT,SsexINT);

对应的数据结构如下图所示:

图4数据结构图

6.SHOWTABLES语句

(1)产生式语法结构:

show_tables:

SHOWTABLES';';

非终结符show_tables无属性

(2)以实例说明该数据结构:

SHOWTABLES;

无数据结构

7.DROPTABLE语句

(1)产生式语法结构:

drop_table:

DROPTABLEtable';';

非终结符drop_table的属性使用如右结构说明:

char*yych;

非终结符table的属性:

table:

ID(字符串)

(2)以实例说明该数据结构:

DROPtablecourse;

对应的数据结构如下图所示:

图5数据结构图

8.INSERT语句

(1)产生式语法结构:

insertsql:

INSERTINTOtableVALUES'('insert_values')'';'

|INSERTINTOtable'('insert_fields')'VALUES'('insert_values')'';';

insert_fields:

insert_field|insert_fields','insert_field;

insert_field:

ID;

insert_values:

insert_value||insert_values','insert_value;

insert_value:

'\''ID'\''|NUMBER;

非终结符insertsql的属性使用如下结构说明:

structInsertstruct{//insert语法树根节点

char*table;

structInsertedfields*insert_fields;

structInsertedvalues*insert_values;

};

非终结符insert_fields与insert_field的属性使用如下结构说明:

structInsertedfields{//insert语句中插入的列的定义

char*field;

structInsertedfields*next_field;

};

非终结符insert_values与insert_value的属性使用如下结构说明:

structInsertedvalues{//insert语句中插入的值的定义

inttype;

char*value;

structInsertedvalues*next_value;

};

(2)以实例说明该数据结构:

INSERTINTOStudent(Sname,Sage,Ssex)VALUES(“zhangsan”,22,1);

对应的数据结构如下图所示:

图6数据结构图

9.SELECT语句

(1)产生式语法结构:

selectsql:

SELECTfields_starFROMtables';'

|SELECTfields_starFROMtablesWHEREconditions';';

fields_star:

table_fields|'*';

table_fields:

table_field|table_fields','table_field;

table_field:

field|table'.'field;

tables:

tables','table|table;

conditions:

condition|'('conditions')'|conditionsANDconditions

|conditionsORconditions;

condition:

comp_leftcomp_opcomp_right;

comp_left:

table_field|NUMBER|'\''ID'\'';

comp_right:

table_field|NUMBER|'\''ID'\'';

comp_op:

'<'|'>'|'='|'!

''=';

非终结符selectsql的属性使用如下结构说明:

structSelectstruct{//select语法树根节点

structSelectedfields*sf;

structSelectedtables*st;

structConditions*cons;

};

非终结符fields_star、table_fields与table_field的属性使用如下结构说明:

structSelectedfields{//select语句中查询的列的定义

char*table;

char*field;

structSelectedfields*next_sf;

};

非终结符tables的属性使用如下结构说明:

structSelectedtables{//select语句中查询的表的定义

char*table;

structSelectedtables*next_st;

};

非终结符condition、conditions、comp_left、comp_right、comp_op的属性使用如下结构说明:

structConditions{//select语句中查询的条件的定义

structConditions*left;

structConditions*right;

charcomp_op;

inttype;

char*value;

char*table;

};

(2)以实例说明该数据结构:

SELECTSname,SageFROMStudentWHERE(Sage>21)AND(Ssex=0);

对应的数据结构如下图所示:

图7数据结构图

10.DELETE语句

(1)产生式语法结构:

deletesql:

DELETEFROMtable';'

|DELETEFROMtableWHEREconditions';';

非终结符deletesql的属性使用如下结构说明:

structDeletestruct{//delete语法树根节点

char*table;

structConditions*cons;

};

(2)以实例说明该数据结构:

DELETFROMStudentWHERESage<21;

对应的数据结构如下图所示:

图8数据结构图

11.UPDATE语句

(1)产生式语法结构:

updatesql:

UPDATEtableSETfield_expressions';'

|UPDATEtableSETfield_expressionsWHEREconditions';';

field_expressions:

field_expression

|field_expressions','field_expression;

field_expression:

field'='expression;

expression:

'\''ID'\''|NUMBER;

非终结符updatesql的属性使用如下结构说明:

structUpdatestruct{//update语法树根节点

char*table;

structUpdatedfields*fe;

structConditions*cons;

};

非终结符field_expressions与field_expression的属性使用如下结构说明:

structUpdatedfields{//update语句中更新的字段定义

char*field;

structExpression*expression;

structUpdatedfields*next_fe;

};

非终结符expression的属性使用如下结构说明:

structExpression{//update语句中更新的值的定义

inttype;//1表示字符串,2表示整数

char*value;

};

(2)以实例说明该数据结构:

UPDATEStudentSETSage=21WHERESsex=1;

对应的数据结构如下图所示:

图9数据结构图

12.EXIT语句

(1)产生式语法结构:

exit:

EXIT';';

(2)以实例说明该数据结构:

EXIT;

无数据结构。

 

2.3执行流程

使用到的所有外部函数如下:

函数名称:

judge_cons(structConditions*p)

函数说明:

当删除或者更新一个表的数据时,判断语句中的条件是否正确,即检查条件中的字段是否存在,条件中操作符两端的数据类型是否一致。

输入参数:

structConditions*p,条件结点

输出参数:

1表示正确,0表示错误

执行流程:

(1)判断条件左部是否为空,若不为空,转

(2);若为空,转(3)。

(2)以条件左部为参数,递归调用得到左部的返回值,若左部返回值为0,则返回0;若左部返回值为1,以条件右部为参数,递归调用得到右部的返回值。

若右部返回值为0,则返回0;若右部返回时为1,则返回1。

(3)若条件的类型是字段,检查表中是否存在此字段,若不存在,则置标志变量为0;若存在,则判断它是上一层条件的左部还是右部。

若是左部,则记录下此字段的类型,置标志变量为1;若是右部,则判断此字段的类型与左部条件的类型是否相同,相同则置标志变量为1,不同则置标志变量为0。

若条件的类型是字符串或整型,判断它是上一层条件的左部还是右部。

若是左部,则记录下此时条件的类型,置标志变量为1;若是右部,则判断此条件的类型与左部条件的类型是否相同,相同则置标志变量为1,不同则置标志变量为0。

最后,返回标志变量。

函数名称:

judge(structConditions*p)

函数说明:

当删除或者更新一个表的数据时,判断表中一个元组是否满足删除或者更新的条件。

输入参数:

structConditions*p,条件结点

输出参数:

1表示满足条件,0表示不满足条件

执行流程:

(1)判断条件左部是否为空,若不为空,转

(2);若为空,转(5)。

(2)以条件左部与条件右部为参数,递归调用得到左部与右部的返回值,若左部返回值与右部返回值均为2,转(3);否则,转(4)。

(3)判断条件中的操作符,若操作符为“>”,判断条件的左部值是否大于条件的右部值,若是则返回1;否则返回0。

同理,可以处理操作符分别为“>”、“=”、“!

”时的情况。

(4)判断条件中的操作符,若操作符为“a”以条件左部为参数,递归调用得到左部的返回值,若左部返回值为0,则返回0;若左部返回值为1,以条件右部为参数,递归调用得到右部的返回值。

若右部返回值为0,则返回0;若右部返回时为1,则返回1。

同理,可以处理操作符为“o”时的情况。

(5)若条件的类型是字段,根据表中各个字段的长度偏移,找到该字段在一个元组中的相对位置,接着判断它是上一层条件的左部还是右部。

若是左部,则将该字段在元组中的值赋值给左部值变量;若是右部,则将该字段在元组中的值赋值给右部值变量。

若条件的类型是字符串或整型,判断它是上一层条件的左部还是右部。

若是左部,则将结点p中传来的值赋值给左部值变量;若是右部,则将结点p中传来的值赋值给右部值变量。

判断结束,返回2。

函数名称:

judge_set(structUpdatedfields*p)

函数说明:

当更新一个表的数据时,判断语句中set部分是否正确,即检查set部分中的字段是否存在,以及字段的类型与更新的值的类型是否一致。

输入参数:

structUpdatedfields*p,更新字段结点

输出参数:

1表示正确,0表示错误

执行流程:

(1)当set结点不为空时,转

(2),否则,返回1。

(2)检查表中时候存在该字段以及字段的类型与更新的值的类型是否一致,若是,则p转向下一个更新字段结点,转

(1);否则,返回0。

函数名称:

update_data(structUpdatedfields*p)

函数说明:

更新数据,当表中的一个元组标记为可更新时,更新元组,然后将改变的元组写进一个新的文件;否则,直接将原来的元组写进此新的文件。

输入参数:

structUpdatedfields*p,更新字段结点

输出参数:

无返回值

执行流程:

(1)判断元组是否标记为可更新,若是,则转

(2);否则,转(3)。

(2)根据结点p,在元组中将set部分中需要更新的字段进行更新。

所有字段更新完成,转(3)。

(3)将元组写入一个新的文件。

函数名称:

judge_sf(structSelectedfields*p)

函数说明:

当进行查询时,判断选择的属性列是否正确(在表中是否存在,多表查询不带表的名称时是否唯一)。

输入参数:

structSelectedfields*p,查询的属性列结点

输出参数:

1表示选择属性列正确,0表示选择属性列错误

执行流程:

(1)判断选择属性列的结点内容是否为空,若为空(表示选择的属性列为“*”),返回1;否则,转

(2)。

(2)判断选择属性列的结点p是否为空,若为空,转(4);否则,转(3)。

(3)判断当前属性列是

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1