SQL分析器
SQL分析器是这个程序的核心并且是最复杂的部分。和写一个SQL分析器相比,写一个HTML代码或C++代码分析器是极其简单的。
别的语言都有固定的语法规则(比如在HTML里,所有的标签从<TAG>开始,以</TAG>结束,或者在C++里,所有的命令都是以function(argument,argument);构成的,每一行代码都是以”:”结束),但是SQL这么”语言”却没有规则。
没有方法知道一个命令何时结束。最复杂的SELECT命令可以包含一个WHERE子句也可以不包含。它也许有一个JOIN子句也许没有,等等。在再没有子句跟着的时候它就结束了。
断行符可以在任何地方出现或完全丢失。
括弧可以在任何地方出现或没有。
一些命令(比如 LEFT)也许是个关键字(在JOIN LEFT里)或是一个函数(在left(string,count)里)。
最后,SQL完全不是一门编程语言。它会被经验不足的程序员滥用,产出的代码像来自地狱。SqlBuilder的分析器有能力清除任何丑陋的SQL代码。
它执行以下五个步骤:
1.第一个分析器分析无格式的SQL文本,搜索命令、关键字、函数、数据类型、操作符,字符串、数字和注释等然后将它们每一个创建成一个ParserItem实例存储在一个双向链表中。
2.第二个分析器分析所有的括弧如果他们非常复杂的话就将它们分隔成多行。
3.第三个分析器递归的分析一些复杂的命令,比如SELECT、CASE、CREATE、BEGIN、END……
4.第四个分析器分析并纠正所有的断行符
5.最后一个分析器填充RtfHtmlBuilder(如下),从分析数据创建RTF文档、HTML代码或纯文本文件。
只有第一个步骤和纯文本文件一起工作。接下来的步骤都是在对象上操作,这样它们分析的非常快速,所以分析只会发生在输入文本的时候。如果前一趟分析还没有结束的时候你输入了一个新的字母,那么先前的分析会被取消并且重新开始一个新的分析。所有这些东西都在后台运行,对用户是透明的。
“Defaults”类
SqlBuilder有一个名为Defaults的类。在这里你可以定义你自己的喜欢的默认设置,比如分析器使用的颜色,超时时间或在用户没有指定服务器时使用的默认SQL Server服务器。
|