编译原理上机报告.docx
《编译原理上机报告.docx》由会员分享,可在线阅读,更多相关《编译原理上机报告.docx(16页珍藏版)》请在冰点文库上搜索。
编译原理上机报告
编译原理上机报告
《DBMS的设计与实现》
学号:
03111295姓名:
王永刚
手机:
XXXXXXX邮箱:
XXXXXX@
完成时间:
2014年6月9日
目录
1.项目概况3
1.1基本目标3
1.2完成情况4
1.3逻辑结构与物理结构5
1.4语法结构与数据结构6
1.5执行流程9
a)功能测试13
2.总结与未来工作19
a)未完成功能19
b)未来实现方案19
1.
项目概况
1.1基本目标
设计并实现一个DBMS原型系统,可以接受基本的SQL语句,对其进行词法分析、语法分析,然后解释执行SQL语句,完成对数据库文件的相应操作,实现DBMS的基本功能。
1.CREATEDATABASE创建数据库
2.USEDATABASE选择数据库
3.CREATETABLE创建表
4.SHOWTABLES显示表名
5.INSERT插入元组
6.SELECT查询元组
7.UPDATE更新元组
8.DELETE删除元组
9.DROPTABLE删除表
10.DROPDATABASE删除数据库
11.EXIT退出系统
注:
支持数据类型有INT、CHAR(N)等
加深编译原理基础知识的理解:
词法分析、语法分析、语法制导翻译等;
加深相关基础知识的理解:
数据库系统、数据结构、操作系统等。
1.2完成情况
已经实现全部的词法分析和语法分析,以及大部分语义分析。
已经实现的功能、语句:
CREATEDATABASE
USEDATABASE
CreateTABLE
INSERT
SELECT
DROPTABLE
DROPDATABASE
EXIT
项目实现方案
1.3逻辑结构与物理结构
该物理结构的优点、缺点分析。
表1用户元数据的逻辑结构
列名
说明
类型
User
用户名
Char(20)
Pwd
密码
Char(20)
…
…
…
表2表数据的逻辑结构
表名
列集合
行数据
Stu
列名集合
行数据集合
表3表数据的逻辑结构
数据库名
表集合
Dbname
Alltables
数据库物理结构:
其中sys.txt为系统表。
第一个数字表示当前系统中有两个数据库
下边有两行,每行中第一个数字表示后面字符串的长度,后面的字符串是数据库的名字
每个文件夹中是本数据库的信息,如xjgl这个数据库中:
其中sys.txt是本数据库表,其中记录本数据库中有多少个表,以及各表的信息。
,
Stu.txt存放Stu这个表的数据。
该物理结构的优点:
文件内容为文本,易于调试程序。
结构简单,易于操作。
缺点:
不利于扩充。
1.4语法结构与数据结构
structlistdblist;
structdb*curdb;
%union/*定义yylval的格式*/
{/*属于create语法树的类型*/
char*idvalue;
structtbl*tbs;
enumtypes*tps;
structcol*col;
structtbl*tb;
structintypes*itps;
intintval;
structlist*L;
structforcol*fc;
}
1.CREATE:
CREATEDATABASEsqlID创建数据库
用到的数据结构:
structlistdblist;
structdb
{
structlist_elemelem;
structlisttbs;
char*name;
};
其中dblist是在系统启动时初始化的。
2.CREATE:
CREATETABLEtable"("fielddefine")"
structtbl
{
structlistcollist;///所有列名
structlist**data;//表数据
structlist_elemelem;
char*name;//表名
intncol;
intnrow;
intsize;
intcurrow;
};
每个列
structcol
{
char*colname;//列名
enumtypestype;//列类型
intlen;//长度
structlist_elemelem;
};
enumtypes
{
tint,
tchar
};
structintypes
{
enumtypestps;
intlen;
};
3.INSERT:
INSERTINTOtableVALUES"("val")"
unionsqltype//具体数据
{
intd1;
char*d2;
};
structforcol//每列的数据
{
unionsqltyped;
structlist_elemelem;
enumtypestp;
};
4.整体结构
1.5执行流程
INSERT:
INSERTINTOtableVALUES"("val")"{
inti;
structtbl*tb=list_entry(list_find(&curdb->tbs,FindTb,$3),
structtbl,elem);
if(tb->nrow+1>=tb->size)
{
tb->data=realloc(tb->data,(2*tb->size+1)*sizeof(structlist*));
if(tb->data==NULL)
{
printf("Realloctb->datafailed!
\n");
return;
}
tb->size=2*tb->size+1;
}
tb->data[tb->nrow++]=$6;
list_foreach($6,ShowRowVal,tb);
printf("\n");
//printf("%s%s%d\n",tb->data[0].d2,tb->data[1]
}
|INSERTINTOtable"("param")"VALUES"("val")"
;
INSERT:
INSERTsql
;
INTO:
INTOsql
;
VALUES:
VALUESsql
;
val:
tval{$$=(structlist*)malloc(sizeof(structlist));
list_init($$);
list_push_back($$,&$1->elem);
}
|val","tval
{
list_push_back($1,&$3->elem);
$$=$1;
}
;
tval:
"'"NUMBER"'"{$$=(structforcol*)malloc(sizeof(structforcol));
$$->d.d1=$2;
$$->tp=tint;
}
|"'"ID"'"{$$=(structforcol*)malloc(sizeof(structforcol));
$$->d.d2=$2;
$$->tp=tchar;
}
|"'"DOUBLEX"'"
;
param:
ID
|param","ID
;
//////////////////////////////////////
SELECT:
SELECT"*"FROMtbl{
inti;
structtbl*tb=list_entry(list_find(&curdb->tbs,FindTb,$4),
structtbl,elem);
for(i=0;inrow;i++)
{
list_foreach(tb->data[i],ShowRowVal,0);
printf("\n");
}
}
|SELECTparam1FROMtblsWHEREparam2
;
SELECT:
SELECTsql
;
FROM:
FROMsql
;
WHERE:
WHEREsql
;
tbls:
tbls","ID
|ID
;
tbl:
ID{$$=$1;}
;
param1:
param1","ID
|ID
;
param2:
"("param2")"
|param2ANDsqlparam2
|param2ORsqlparam2
|NOTsqlparam2
|IDREL"'"ID"'"
|IDRELNUMBER
;
REL:
"="
|">"
|"<"
|">""="
;
a)功能测试
测试所实现的SQL语句的基本功能,框架如下:
测试1
输入:
createdatabasexjgl
createdatabasetushuguanli
输出:
测试2
输入:
usexjgl
输出:
测试3
输入:
createtableStu(Snamechar(10),Snochar(10),Sageint)
createtableGrade(Snochar(10),Cnamechar(20),Gradeint)
输出:
测试4
输入:
insertintoStuvalues('wyg','x03111295','22')
insertintoStuvalues('wa','x03111294','23')
insertintoStuvalues('wb','x03111293','21')
insertintoStuvalues('xl','x03111291','24')
insertintoGradevalues('x03111295','English','99')
insertintoGradevalues('x03111295','Math','98')
insertintoGradevalues('x03111295','DataBase','80')
insertintoGradevalues('x03111295','OperateSystem','90')
select*fromStu
select*fromGrade
输出:
测试5
输入:
usetushuguanli
createtablebook(BookNamechar(20),Authorchar(20),priceint)
insertintobookvalues('CProgram','wyg','32')
insertintobookvalues('English','al','20')
insertintobookvalues('LinuxNet','xdj','69')
select*frombook
输出:
2.
总结与未来工作
a)未完成功能
没有把数据内容写入到文件,现在的数据库只是存在于内存中。
Select语句没有完全实现,只实现了简单的功能。
b)未来实现方案
预计未来可以把数据写入到文件里。
在DBMS启动时载入数据到内存,在DBMS关闭时把数据写回内存。