西电编译原理上机报告.docx
- 文档编号:3674195
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:38
- 大小:628.88KB
西电编译原理上机报告.docx
《西电编译原理上机报告.docx》由会员分享,可在线阅读,更多相关《西电编译原理上机报告.docx(38页珍藏版)》请在冰豆网上搜索。
西电编译原理上机报告
编译原理上机报告
《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)判断当前属性列是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 上机 报告