欢迎来到天天文库
浏览记录
ID:33499686
大小:1.29 MB
页数:48页
时间:2019-02-26
《数据库系统原理课程设计总结报告.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、黑龙江大学“数据库系统原理课程设计”总结报告学院软件学院年级2011级专业软件工程学号20113311姓名杜常数报告日期2013/12/21成绩黑龙江大学计算机科学技术学院黑龙江大学软件学院数据库系统原理课程设计20113311杜常数1、开发环境硬件环境:WindowsXP/Win7操作系统软件环境:MicrosoftVisualStudio20052、DBMS系统架构如图2-1所示,通过该类图可以大致看到所有的类的属性、行为以及各个类相互之间的关系。图2-1DBMS静态类图在运行本系统时,会先通过Ganalysis的构造方法对系统进行初始化
2、,包括载入文法和文法的分析表。载入成功后用户输入SQL语句时main函数会调用intGanalysis::analysis_sql(charsql[])对输入的语句进行处理,如果文法分析不通过时返回一个正数(错误出现的位置),main函数则会调用voidGanalysis::showError();来显示语法错误。如果语法分析成功,analysis返回OK(-2),Ganalysis会调用相应的模块来具体执行SQL语句。此时不管具体执行结果如何,都会返回OK,在主函数中再调用voidGanalysis::showExecuteResult()
3、;来显示执行的结果。如下图2-2为该系统语法分析失败时的序列图,图2-3为系统语法分析成功时的序列图:48数据库系统原理课程设计20113311杜常数图2-2语法分析失败序列图图2-3语法分析成功时的系统序列图3、DBMS主要功能模块本DBMS主要包含6个模块,分别是SQL语言的词法和语法分析功能模块、创建数据库及数据操作功能模块、索引的创建及删除模块、查询功能模块、查询优化模块、数据库保护功能模块。在以下的各小节中将会详细介绍。3.1SQL语言的词法和语法分析(1)功能介绍该部分利用已有的编译知识,完成SQL语句的词法和语法分析工作,48数
4、据库系统原理课程设计20113311杜常数对用户输入的SQL语句进行检验是否正确。如果输入正确则进一步做处理,否则指出错误的位置。进一步了解DBMS中数据字典的作用,并为后续的查询处理和优化实验打好基础。主要包括的词法语法分析语句包括:(1)createtable(8)createindex(2)droptable(9)dropindex(3)altertable(10)createview(4)insert(11)dropview(5)delete(12)createuser(6)update(13)grant(7)select(14)re
5、voke(2)相关理论首先使用词法分析将语句中各个单词分离出来,包括关键字、标识符、整数、运算符、界符等;第二步使用语法分析器判别语句中的语法错误,即不同中来的单词搭配错误;第三步使用语义分析,校对语义错误。SLR语法分析器由输入、输出、栈、驱动程序及包含动作(action)和转移(goto)两部分的语法分析表构成的。驱动程序对所有的SLR语法分析器都是一样的,不同的语法分析器只是语法分析表有所不同。分析程序每次从输入缓冲区读入一个符号,并使用栈来存储形如s0X1s1X2s2…Xmsm的串。其中sm在栈顶,Xi是文法符号,Si是称为状态的符号
6、,每个状态符号概括了栈中位于它的下面的信息。栈顶的状态符号和当前的输入符号用来检索语法分析表,以决定移动规约分析的动作。在实际实现中,文法符号不必出现在栈里。SLR1语法分析的模型如图3.1-1所示:48数据库系统原理课程设计20113311杜常数图3.1-1(3)算法描述首先需要对输入的字符串进行词法分析,先通过函数voidstrChange(stringstr,vector&vecStr);函数对字符串进行分割,将str中的单词、操作符等分成一个一个的string类型的字符串,并保持在vecStr中。具体的实现算法如下所示
7、:voidstrChange(stringstr,vector&vecStr){for(i=0;i8、9、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(tem10、p);temp清空}else{temp+=str[i++];如果第i+1个字符串是分割符或操作符,则将temp保存到vecStr中。}}//forif(temp非空
8、
9、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(tem
10、p);temp清空}else{temp+=str[i++];如果第i+1个字符串是分割符或操作符,则将temp保存到vecStr中。}}//forif(temp非空
此文档下载收益归作者所有