数据库系统原理课程设计总结报告
- 格式:doc
- 大小:218.50 KB
- 文档页数:34
黑龙江大学
“数据库系统原理课程设计”总结报告
学院软件学院
年级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
void strChange(string str,vector
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所示: