数据库系统原理课程设计总结报告

  • 格式:doc
  • 大小:218.50 KB
  • 文档页数:34

下载文档原格式

  / 34
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

黑龙江大学

“数据库系统原理课程设计”总结报告

学院软件学院

年级2011级

专业软件工程

学号

姓名杜常数

报告日期2013/12/21

成绩

黑龙江大学计算机科学技术学院

黑龙江大学软件学院

1、开发环境

硬件环境:Windows XP/Win7操作系统

软件环境:Microsoft Visual Studio 2005

2、DBMS系统架构

如图2-1所示,通过该类图可以大致看到所有的类的属性、行为以及各个类相互之间的关系。

图2-1 DBMS静态类图

在运行本系统时,会先通过Ganalysis的构造方法对系统进行初始化,包括载入文法和文法的分析表。载入成功后用户输入SQL语句时main函数会调用int Ganalysis::analysis_sql(char sql[])对输入的语句进行处理,如果文法分析不通过时返回一个正数(错误出现的位置),main函数则会调用void Ganalysis::showError();来显示语法错误。如果语法分析成功,analysis返回OK(-2), Ganalysis会调用相应的模块来具体执行SQL语句。此时不管具体执行结果如何,都会返回OK,在主函数中再调用void Ganalysis::showExecuteResult ();来显示执行的结果。

如下图2-2为该系统语法分析失败时的序列图,图2-3为系统语法分析成功时的序列图:

图2-2语法分析失败序列图

图2-3 语法分析成功时的系统序列图

3、DBMS主要功能模块

本DBMS主要包含6个模块,分别是SQL语言的词法和语法分析功能模块、创建数据库及数据操作功能模块、索引的创建及删除模块、查询功能模块、查询优化模块、数据库保护功能模块。在以下的各小节中将会详细介绍。

3.1 SQL语言的词法和语法分析

(1)功能介绍

该部分利用已有的编译知识,完成SQL语句的词法和语法分析工作,对用户输入的SQL语句进行检验是否正确。如果输入正确则进一步做处理,否则指出错误的位置。进一步了解DBMS中数据字典的作用,并为后续的查询处理和优化实验打好基础。

主要包括的词法语法分析语句包括:

(1)create table (8)create index

(2)drop table (9)drop index

(3)alter table (10)create view

(4)insert (11)drop view

(5)delete (12)create user

(6)update (13)grant

(7)select (14)revoke

(2)相关理论

首先使用词法分析将语句中各个单词分离出来,包括关键字、标识符、整数、运算符、界符等;第二步使用语法分析器判别语句中的语法错误,即不同中来的单词搭配错误;第三步使用语义分析,校对语义错误。

SLR语法分析器由输入、输出、栈、驱动程序及包含动作(action)和转移(goto)两部分的语法分析表构成的。驱动程序对所有的SLR语法分析器都是一样的,不同的语法分析器只是语法分析表有所不同。分析程序每次从输入缓冲区读入一个符号,并使用栈来存储形如s0X1s1X2s2…X m s m的串。其中s m在栈顶,Xi 是文法符号,Si是称为状态的符号,每个状态符号概括了栈中位于它的下面的信息。栈顶的状态符号和当前的输入符号用来检索语法分析表,以决定移动规约分析的动作。在实际实现中,文法符号不必出现在栈里。SLR1语法分析的模型如图3.1-1所示:

图3.1-1

(3)算法描述

首先需要对输入的字符串进行词法分析,先通过函数void strChange(string str,vector &vecStr); 函数对字符串进行分割,将str中的单词、操作符等分成一个一个的string类型的字符串,并保持在vecStr中。具体的实现算法如下所示:

void strChange(string str,vector &vecStr){

for (i=0;i

if(str[i]==' '||str[i]=='\t'){

i++;

continue;

}

if(str[i]是运算符){//

if(temp非空){

将temp中保存的字符串保存到vecStr中

}

temp=str[i++];

if(第i+1个也是字符操作符?){

如果str[i]与str[i+1]能构成"!=",">=","<="则将

temp+=str[i++];

}

vecStr.push_back(temp);

temp清空

}

else {

temp+=str[i++];

如果第i+1个字符串是分割符或操作符,则将temp保存到vecStr中。

}

}//for

if(temp非空){

向vecStr中保存temp

}

}

对字符串进行分割后就可以进行文法分析了。利用函数int

analysis::analysis_str(char sql[],string &error)对SQL语句进行文法分析。其中函数bool analysis::action_at(int row, std::string vtch, int &num);将第row行符号为vtch的值保存到引用参数num中,如果action表对应的位置数据无效时将返回false.函数bool analysis::goto_at(int row,char vnch,int

&num)与action函数实现的功能类似。

语法分析时首先把初始状态S0放在语法分析器的栈顶,把‘#‘压入符号栈中。然后执行如下部分的算法:

for(i=0;i

if(!action_at(status.top(),str[i],num)){

分析出错,返回错误位置为第i个单词;

}

if(num>0){//移进

状态栈中入栈num;

符号栈中入栈str[i++];

}

else if(num<0){//规约

按照第num个产生式α→β进行规约,如果规约过程中出现栈空无法继续进行则返回错误位置为i-1

}

if(!goto_at(status.top(),p->left,num)){

返回错误位置为i-1个单词

}

将num压入状态栈,将第num个产生式α→β的左部α压入符号栈。

}

else if(num==0){

分析成功,返回OK

}

}

if(i==str.size())

返回出错位置为i-1个单词

(4)程序流程图

对字符串分割的函数流程图如下图3.1-2所示:

相关主题