查询语句QL的语义分析和实现 第7页
5.3 表达式计算的设计与实现
5.3.1 表示布尔表达式的方法
程序设计语言中的布尔表达式有两个作用。一是计算逻辑值,二是用做改变控制流语句中的条件表达式。计算布尔表达式的值有两种办法, 第一种办法,如同计算算术表达式一样,步步计算出各部分的真假值,最后计算出整个表达式的值。例如,用数1表示true,用0表示false。那么布尔表达式1 or(not 0 and 0)or 0的计算过程是:1 or(not 0 and 0)or 0=1 or(1 and 0)or 0=1 or 0 or 0=1 or 0=1
另一种计算方法是采取某种优化措施,只计算部分表达式,用控制流,即用程序中的位置来表示布尔表达式的值,用这种方式实现控制流语句的布尔表达式尤其方便。
5.3.2 布尔表达式求值算法
在进行语义分析,对Where 后面的条件进行语法制导翻译时,直接用布尔运算符替换,既and&&,or||,not!;当接口约定后,直接用表中列的索引值代替列名,如:{0}='d' and {3}<=5 and (not {5}=9)。计算布尔表达式时可以先拆分每个表达式,逐个求值。如果从左到右依次扫描求值时,算法如下:
设立两个栈:运算符号w栈和运算分量a栈,步骤如下:
(1) 从左到右扫描布尔表达式,遇到运算分量,则运算分量入a栈,继续本步。否则遇到运算符,则进行下一步,即转(2);
(2) 检查w栈内有无元素,若没有,则当前运算符进w栈,转(1),否则进行(3);
(3) 比较运算符的优先级别,若当前运算符的优先级别大于w栈顶的运算符的优先级别,则当前运算符进w栈,转(1),否则进行(4);
(4) 根据w栈栈顶运算符的性质(单目或多目运算符),在a栈顶取一个或两个分量,进行计算,并把结果T送入a栈,转(2),重复上述过程,直至结束。
部分程序见附录。
5.3.3 如何判断逻辑运算符优先级别
先定义一个优先级别表,表里包含了运算符及其优先级别的对应关系,包括大于、小于、等于,输入运算符即可得到其运算级别进行运算优先判断。优先级别如下图 5 4:
图 5 4 优先级别图
5.4 单表和多表查询的设计
对单表和多表的查询,均使用函数,具体如下:(应增加查询的具体实现)
(1)单表:bool CheckCondition(string aryColData[],Type aryColType[],string sCondition){…}
其中:数组aryColData[],存放表中列名的索引值;数组aryColType[],存放数据类型;
sCondition,为条件表达式;条件经语法制导翻译为数值形式,如:
{0}='d' && {3}<=5 && (!{5}=9)
{i}中i表示列值,与 tp 和 ary 的索引值相对应,表示相关列
(2)在单表的基础上,实现多表。
多表:bool CheckCondition(string Arraylist[],Type[] aryColType,string sCondition){…}
其中:Arraylist 为数组矩阵,每个元素Item 包括String data[], type Type[], 各个Item里数组长度未必相等; aryColType[],存放数据类型; sCondition为条件表达式。
单表和多表若要根据数据类型进行更多控制,则可使用 aryColType以判断日期、字符等类型。
6 总结与展望
6.1 总结
本文基于自主知识产权数据库数据定义语言的词法分析、语法定义规则、语法分析的工作原理,充分运用编译原理中的语义分析,语法制导翻译的理论知识,综合运用数据结构的基础上。在Visual C++6.0开发平台上对自主知识产权数据库中的查询语句的语义分析进行设计与实现。在进行语法分析的同时,通过语法制导翻译,实现语义分析,主要实现的功能有:接口参数约定,传入后,能正确的进行替换,翻译成易于计算的形式,如:{0}='d' && {3}<=5 && (!{5}=9)。语义正确时,经分析后能够正确显示表名和相应的列名;错误时,给予提示。布尔表达式的计算结果,用以检查条件是否成立,为事务处理提供函数接口,以便进行正确的查询。
本文只是对数据查询语句作初探,是对SQL语言中的查询语句进行简单的语义分析所以不是太完善,不能达到理想的效果。对函数、语句的类型检查不能实现,只能对简单的类型匹配进行检查,如:数据类型匹配,越界等。对SQL语句中多表查询,函数的引用,还不能正确的判断是否正确,不能进行正确的语义分析。当SQL语句的语法出错时分析器只能直接跳出显示语法错误,但不能给用户以详细的信息,告诉用户是什么原因,造成了不能接受这条语句。本文在产生式的文件输入时,必须要输入正确,否则计算结果就会出错。如果要修改产生式,只有在程序目录中将产生式文件删除后,并且更改产生式条数后,才可以正确运行。终结符和非终结符的个数是限定的。在各个算法中循环次数比较多。所以运算效率不是太高。
本文来源于自主知识产权数据库项目中的一个模块。在掌握了编译原理基本理论的基础上,通过进行自主知识产权数据库之查询语句QL的语义分析与实现,学习了编译器的设计思想,加深了对编译原理的理解,使数据库及编程方面的知识得以充分应用,针对编译过程中的重点和难点进行了编程实践;独立完成了一定工作量的程序设计,检验了大学四年专业知识的学习情况,已经达到目的。
6.2 展望
虽然能对简单的数据查询语句能进行语义分析了,但还有很多可以完善的工作。
主要在以下几点:
(1) 要实现多表查询,就要更改词法分析表的结构,当时定义的结构是一文数组,只能进行单表查询;
(2) 要能够进行完全的类型检查,包括函数的检查,语句和表达式的检查,就要扩充语法结构函数的定义,表达式的定义等;
(3) 增加终结符和非终结符的定义,以便能实现更多的查询语句,而不是只能进行简单的查询;
(4) 对程序进行优化,以便提高运算效率,由于在语法分析阶段采用LL(1)分析法,分析能力有限,要扩充其分析能力,至少在语法分析阶段采用LR分析法。
(5) 对复杂语句的查询,要考虑对文法左递归的消除。
(6) 对查询优化时,要在词法结构中对关键字进行定义。
如果时间允许,对以上存在需要改进的地方,不仅能提出设计的思想和改进的方法,而且能在实践中实现。希望能在以后的工作中,完成比较复杂的查询语句语义分析,在进行比较大的设计和实现时,考虑的更全面。
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页
查询语句QL的语义分析和实现 第7页下载如图片无法显示或论文不完整,请联系qq752018766