SQL解析器之词法分析--预扫描

本文介绍了一种SQL语句在解析前的预处理方法,包括去除注释、前导空格、压缩多余空格、去除换行符,以简化语法分析过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我设计的在SQL语句解析之前,先必须进行预扫描,其作用是

  • 去除注释
  • 去除前导空格
  • 并且将各单词之间的多个空格压缩成一个
  • 并且去掉所有的换行符便于语法分析
 1 function TSCanner.Pro_Process(str: string): string;
2 var
3 sTemp, sTemp1: string;
4 sList: TStringList;
5 iPos, iPos1, i: Integer;
6 begin
7 sList := TStringList.Create;
8 sList :=SplitString(str,#13#10);
9 for i := 0 to sList.Count - 1 do
10 begin
11 sTemp := sList[i];
12 iPos := Pos('//', stemp);
13 if iPos > 0 then
14 begin
15 sTemp1 := Copy(sTemp, 1, iPos - 1);
16 sList[i] := sTemp1;
17 end;
18 end;
19
20 sTemp := sList.Text;
21 sList.Free;
22
23 sTemp := StringReplace(sTemp, #13#10, ' ', [rfReplaceAll]);
24 while Pos(' ', sTemp) > 0 do
25 sTemp := StringReplace(sTemp, ' ', ' ', [rfReplaceAll]);
26 sTemp := Trim(StringReplace(sTemp, ', ', ',', [rfReplaceAll]));
27 iPos :=Pos('/*',sTemp);
28 if iPos>0 then
29 begin
30 iPos1 :=Pos('*/',sTemp);
31 if iPos1>0 then
32 begin
33 sTemp :=Trim(Copy(sTemp, 1,iPos-1)+copy(sTemp,iPos1+2,Length(sTemp)-ipos1-1));
34 end;
35 end;
36 sTemp1 := UpdateAllKey(sTemp);
37 Result := sTemp1;
38 end;
39
40
41 function TSCanner.UpdateAllKey(sWords:string):string;
42 var
43 i,j:Integer;
44 sList:TStringList;
45 sTemp:string;
46 begin
47 sTemp :=sWords;
48 sList :=TStringList.Create;
49 sList.CommaText :=StringReplace(sTemp,' ',#13#10,[rfReplaceAll]);
50 for i:=0 to sList.Count -1 do
51 begin
52 for j:=Low(SQLKEY) to High(SQLKEY) do
53 begin
54 if LowerCase(sList[i])=LowerCase(SQLKEY[j].Content) then
55 begin
56 sTemp :=StringReplace(sTemp,sList[i],UpperCase(SQLKEY[j].Content),[rfReplaceAll]);
57 Break;
58 end;
59 end;
60 end;
61 sList.Free;
62 Result :=sTemp;
63 end;


 

1、支持绝大部分数据库,包括 大型数据库Oracle,Sybase(包括SQL AnyWhere),DB2,MS_SQL 中型数据库MS_Access,MySQL 桌面型数据库Paradox,DBF系列数据库,MS_Execl,Text 其他支持SQL 92标准的数据库 2、数据库的连接采用ADO连接,因此无需安装和卸载 3、支持SQL查询语句绝大部分语法 3.1 选择字段 3.1.1 Select [All] [Distinct]; 3.1.2 特殊语法,记录条数限定Top(MS_SQL),Rownum(Oracle), Limit(MySQL),Set RowCount(Sybase)) 3.1.3 字段表达式或者计算字段 3.2 选择表 (From) 3.3 条件筛选 (Where) 3.4 分组 (Group By) 3.5 组内条件 (Having) 3.6 排序 (Order By) 3.7 数据表的内连接、外连接 3.7.1 SQL 92 标准:Inner Join、Left Join、Right Join、Full Join, 3.7.2 特殊语法:*=、=*、*=*(MS_SQL,Sybase),(+)(Oracle) 3.8 联合 (Union [All],Minus,Intersect) 3.9 字段别名,数据表别名 3.10 SQL子查询表,内嵌SQL子句 4、粘贴字段、系统函数 5、SQL查询语句反向分析, 无论多么复杂的语句,都能分析得出来 包括上面提到的所有SQL语法 6、SQL文件拖放,然后反向分析 7、数据库视图创建和重建(目前仅支持Oracle,Sybase,MS_SQL) 8、附加Delphi 5和Delphi 6的控件包,支持Delphi 5,6开发环境 9、SQL语句智能换行 10、其他功能 10.1 SQL文件保存、打开 10.2 支持多个数据库连接 10.3 SQL语句关键词高亮度显示 10.4 简单SQL查询语句转换为Delete,Update,Insert语句
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值