SQL解析器之求FIRST集

简介: 本人欲用自顶向下进行SQL的语法分析,在此之前必须进行推导式的FIRST和FOLLOW集的求解,在求解FIST集中要注意 不能有左递归 不能有循环递归,如A->B  B->C C->A,这样会造成分析的死循环 目前完成FIRST集的求解,终结符采用小写的一位字母和')','(','+','...

本人欲用自顶向下进行SQL的语法分析,在此之前必须进行推导式的FIRST和FOLLOW集的求解,在求解FIST集中要注意

  • 不能有左递归
  • 不能有循环递归,如A->B  B->C C->A,这样会造成分析的死循环

目前完成FIRST集的求解,终结符采用小写的一位字母和')','(','+','-'等,非终结符采用大写字母,如有必要可拓展终结符和非终结符

FIRST集求解算法

FIRST(α)的算法(α=x1x2xn):根据定义计算

根据定义计算

  由定义4.1 FIRST(α)={a|αaβ,aVTα,βV*},αε,则规定εFIRST(α)

  对每一文法符号XV 计算FIRST(X)

  (a) XVT,则FIRST(X){X}

  (b) XVN,且有产生式XaaVT aFIRST(X)

  (c) XVNX→ε,εFIRST(X)

   (d) XVNY1Y2YiVN,且有产生式XY1 Y2 Yn

Y1 Y2 Yi-1ε时,(其中1in),则FIRST(Y1)FIRST(Y2)FIRST(Yi-1)的所有非{ε}元素

FIRST(Yi)都包含在FIRST(X)中。

  (e) (d)中所有Yiε,(i=1,2, n),则 FIRST(X)=FIRST(Y1)FIRST(Y2)FIRST(Yn){ε}

  反复使用上述(b)(e)步直到每个符号的FIRST集合不再增大为止。

 

  求出每个文法符号的FIRST集合后也就不难求出一个符号串的FIRST集合。

  若符号串αV*α=X1 X2 Xn,X1不能ε,则置FIRST(α)= FIRST(X1)

  若对任何j(1ji-12in), εFIRST(Xj), FIRST(α)=(FIRST(Xj)\{ε})FIRST(Xi)

  当所有FIRST(Xj)(1jn)都含有{ε}时,则FIRST(α)=(FIRST(Xj)){ε}

代码采用递归求解:

//获得FIRST集
function TSCanner.GetFirst(s: TStringList): TStringList;
var
i,j,k:Integer;
sTemp,MyRes:
string;
Data:PFirst;
s1:PChar;
sList,slTemp1:TStringList;

procedure GetAllProduction(sNoTerminate:string;sList:TStringList;var Res:TStringList);
var
i,j:Integer;
s1:
string;
begin
for i:=0 to sList.Count-1 do
begin
j :
=Pos(FInfer,sList[i]);
if j>0 then
begin
if Trim(MidStr(sList[i],1,j-1))=Trim(sNoTerminate) then
Res.Add(sList[i]);
end;
end;
end;

procedure GetOne(str:string);
var
i,j:integer;
s1,s2,sTemp:
string;
slTemp1:TStringList;
begin
slTemp1 :
=TStringList.Create;
GetAllProduction(str,s,slTemp1);
For i :
=0 to slTemp1.Count-1 do
begin
sTemp :
=Trim(slTemp1[i]);
j :
=Pos(FInfer,sTemp);
if (j>0) then
begin
s1 :
=Copy(sTemp,j+Length(FInfer),1);
s2 :
=Copy(sTemp,j+Length(FInfer),2);
if (InTerminate(s1)) then
begin
if not OneInOther(s1,sTemp) then
MyRes :
=MyRes+s1+ ',';
end
else if (s2='ε') then
begin
if not OneInOther(s2,sTemp) then
MyRes :
=MyRes+s2+','
end
else if InNoTerminate(s1) then
begin
GetOne(s1);
//此处可用一堆栈保存非终结符,有新的非终结符则入栈,入栈前查看栈内是否已有此非终结符
//如有则会导致死循环,报错退出
end;
end;
end;
slTemp1.Free;
end;

begin
sList :
=TStringList.Create;
Result :
=TStringList.Create;
//slTemp1 :=TStringList.Create;
try
GetAllNoTerminate(s,sList);
for i:=0 to sList.Count -1 do
begin
//获取所有sList[i]推导的产生式 如A->a或A->BCa
MyRes :
='';
GetOne(sList[i]);
if Trim(MyRes)<>'' then
Delete(MyRes,Length(MyRes),
1);
New(Data);
Data^.Name :
=sList[i];
Data^.Value :
=MyRes;
Result.AddObject(Data^.Name,TObject(Data));
end;
finally
sList.Free;
//slTemp1.Free;
end;
end;

其中结构体、终结符和非终结符定义如下

 1 PFirst=^TFirst;
2 TFirst=record
3 Name:string;
4 Value:string;
5 end;
6
7 PFollow=^TFollow;
8 TFollow=record
9 Name:string;
10 Value:string;
11 end;
12
13 const
14 arrTerminate:array[1..31] of string=('a','b','c','d','e','f','g','h','i','j','k',
15 'l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',')','(','+','-','ε');
16 arrNoTerminate:array[1..26] of string=('A','B','C','D','E','F','G','H','I','J','K',
17 'L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
相关文章
|
1月前
|
SQL IDE 数据库连接
IntelliJ IDEA处理大文件SQL:性能优势解析
在数据库开发和管理工作中,执行大型SQL文件是一个常见的任务。传统的数据库管理工具如Navicat在处理大型SQL文件时可能会遇到性能瓶颈。而IntelliJ IDEA,作为一个强大的集成开发环境,提供了一些高级功能,使其在执行大文件SQL时表现出色。本文将探讨IntelliJ IDEA在处理大文件SQL时的性能优势,并与Navicat进行比较。
32 4
|
24天前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
2月前
|
SQL 监控 数据库
SQL语句是否都需要解析及其相关技巧和方法
在数据库管理中,SQL(结构化查询语言)语句的使用无处不在,它们负责数据的查询、插入、更新和删除等操作
|
1月前
|
SQL 监控 安全
员工上网行为监控软件:SQL 在数据查询监控中的应用解析
在数字化办公环境中,员工上网行为监控软件对企业网络安全和管理至关重要。通过 SQL 查询和分析数据库中的数据,企业可以精准了解员工的上网行为,包括基础查询、复杂条件查询、数据统计与分析等,从而提高网络管理和安全防护的效率。
29 0
|
2月前
|
SQL 存储 数据库
SQL语句是否都需要解析及其相关技巧与方法
在数据库管理系统中,SQL(Structured Query Language)语句作为与数据库交互的桥梁,其执行过程往往涉及到一个或多个解析阶段
|
2月前
|
SQL 数据可视化 BI
SQL语句及查询结果解析:技巧与方法
在数据库管理和数据分析中,SQL语句扮演着至关重要的角色
|
2月前
|
SQL 监控 关系型数据库
SQL错误代码1303解析与处理方法
在SQL编程和数据库管理中,遇到错误代码是常有的事,其中错误代码1303在不同数据库系统中可能代表不同的含义
|
2月前
|
SQL 存储 关系型数据库
SQL默认索引是什么:深入解析与技巧
在SQL数据库中,索引是一种用于提高查询性能的重要数据结构
|
2月前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:实现过程与关键细节解析an3.021-6232.com
随着互联网技术的快速发展,ASP.NET作为一种广泛使用的服务器端开发技术,其与数据库的交互操作成为了应用开发中的重要环节。本文将详细介绍在ASP.NET中如何连接SQL数据库,包括连接的基本概念、实现步骤、关键代码示例以及常见问题的解决方案。由于篇幅限制,本文不能保证达到完整的2000字,但会确保
|
2月前
|
SQL 分布式计算 大数据
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
70 0

推荐镜像

更多
下一篇
DataWorks