孙兆玉 朱鸿宇 黄宇光
摘 要 本文以查询语句分析为例,从问题描述、语法范式构建、词法分析、语法分析和应用接口设计等方面详细阐述了一种SQL语句解析的通用策略,并介绍了与之相关的冲突消解、可重入策略和错误处理三个方面的技术。
关键词 BNF范式,词法分析,语法分析,冲突消解,可重入
一、 引言
SQL是面向关系数据库操作的一门成熟的高级语言,它是数据库管理系统强大的管理操作接口。每个数据库管理系统(DBMS)都包含有自己的SQL语法、语义分析模块,但通常都不向外提供具体的分析功能函数以及数据结构。然而实际应用中,却有很多地方需要进行SQL语法分析,如:不同标准SQL互相翻译、面向SQL编辑器的报错提示、基于SQL语句的任务分析统计、SQL操作图形化等。
本文介绍了一种采用Flex、Bison分析工具进行SQL语法分析的通用策略,解决了SQL分析过程中的冲突消解、可重入策略和错误处理三大问题,实现了对Oracle的SQL语句进行语法分析并构建完整的SQL语法树的目标,为进一步的处理提供了方便。
二、 Flex、Bison工具
Flex、Bison是上个世纪80年左右出现的Unix环境下分析编译工具lex、yacc的GNU版本。当时贝尔实验室的Stephen C. Johnson是yacc最主要的作者,他采纳了很多先进算法思想,将yacc打造成为一个成功的语法分析编译工具。其后,M. E. Lesk and E. Schmidt 成功推出了词法扫描工具lex,它与yacc是天生兄弟,lex架构上采用了yacc模式,字符串扫描采用了A. V. Aho的算法机制,因此,Schmidt常谦称Johnson和Aho才是lex的元老作者。后来,GNU社区在lex、yacc基础上,推出了Flex、Bison,然后随着不断的技术改进又推出了许多版本,每个版本都有自己的特色,主要针对以前版本功能缺陷的一些修改等。本文推荐使用Flex2.5.31版就具有生成多线程词法扫描器能力。
Flex主要功能是根据用户定制的构词规则,生成面向字符流自动扫描分词的程序。与用户自己动手编写扫描分词程序相比,它的速度和准确度一般都要高。并且采用它,用户可以减少大量的编码。
|