CN113468873B - Pl/sql语言的语法解析方法及装置 - Google Patents
Pl/sql语言的语法解析方法及装置 Download PDFInfo
- Publication number
- CN113468873B CN113468873B CN202110779112.1A CN202110779112A CN113468873B CN 113468873 B CN113468873 B CN 113468873B CN 202110779112 A CN202110779112 A CN 202110779112A CN 113468873 B CN113468873 B CN 113468873B
- Authority
- CN
- China
- Prior art keywords
- metadata information
- grammar
- queried
- metadata
- tree
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000004458 analytical method Methods 0.000 title claims abstract description 40
- 238000000034 method Methods 0.000 claims abstract description 59
- 238000013515 script Methods 0.000 claims abstract description 21
- 230000006870 function Effects 0.000 claims description 19
- 238000004590 computer program Methods 0.000 claims description 9
- 230000008569 process Effects 0.000 claims description 8
- 230000004048 modification Effects 0.000 claims description 5
- 238000012986 modification Methods 0.000 claims description 5
- 230000003993 interaction Effects 0.000 abstract description 5
- 238000010586 diagram Methods 0.000 description 7
- 238000012795 verification Methods 0.000 description 7
- 238000004891 communication Methods 0.000 description 5
- 230000014509 gene expression Effects 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 2
- 230000008878 coupling Effects 0.000 description 1
- 238000010168 coupling process Methods 0.000 description 1
- 238000005859 coupling reaction Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000007689 inspection Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/20—Natural language analysis
- G06F40/253—Grammatical analysis; Style critique
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/242—Query formulation
- G06F16/2433—Query languages
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Audiology, Speech & Language Pathology (AREA)
- General Health & Medical Sciences (AREA)
- Health & Medical Sciences (AREA)
- Artificial Intelligence (AREA)
- Mathematical Physics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供一种PL/SQL语言的语法解析方法及装置,方法通过根据预设语法规则将PL/SQL语言的源脚本切割为token串,并通过parser读取token串;记录token串中出现的源数据库对象,得到元数据组装模块;根据当前语法结构,对parser读取到的token串进行语法检查,通过ID解析器统计需查询元数据信息,生成抽象语法树;根据需查询元数据信息,调用元数据组装模块确定待查询数据库对象;将待查询数据库对象拼接成目标SQL,以通过目标数据库验证待查询数据库对象是否合法;若合法,调用语义检查方法,遍历抽象语法树进行语义检查,得到中间语法树;遍历中间语法树,调用源码解析中间语法树,生成目标语法树的方式,减少了与目标数据库的交互次数,有效地提高了语法解析的效率。
Description
技术领域
本发明涉及语法解析技术领域,尤其涉及一种PL/SQL语言的语法解析方法及装置。
背景技术
语法解析器通常是编译器和解释器的重要组件,主要作用是根据当前解析的语言的语法规则进行语法分析,大多以语法树(syntax tree)或抽象语法树(abstract syntaxtree,AST)作为输出。
目前,大多数的实现方法首先进行词法分析,然后语法解析产生语法树。语法分析parser,不断的从lexer中读取token,根据token串分析当前解析的语言元素,比如变量声明、赋值语句、控制语句等。这时往往会用到符号表栈,符号表栈包含一个或多个符号表,而每个表中又包含多个表项。每个符号表项包含一个一般为标识符token的信息,根据符号表就可以知道出现的token是否已经被定义,以及它的类型、出现的位置等信息。parser基于源语言的语法和语义执行相关动作,如果存在语法或者语义错误,那么给出错误提示,如果不存在错误,那么生成对应的语法树,语法树是源代码的抽象语法结构的树状表示,具有上下层级关系。在Parser阶段按照从上到下依次完成解析,每遇到一个语法结构就会确定当前语法出现的数据库对象是否合法以及类型检查等。
但是,对于PL/SQL语言,很多时候PL/SQL的脚本比较复杂,会包含很多数据库对象,往往会嵌套调用,如果解析这种脚本,传统的从上到下依次一次性完成解析的话,会浪费很多时间和资源,导致解析的效率相对较低。
发明内容
本发明提供一种PL/SQL语言的语法解析方法及装置,用以解决现有技术中语法解析效率低下的缺陷,实现高效地完成语法解析。
本发明提供一种PL/SQL语言的语法解析方法,包括:
根据预设语法规则将PL/SQL语言的源脚本切割为token串,并通过parser读取所述token串;
记录所述token串中出现的源数据库对象,得到元数据组装模块;
根据当前语法结构,对所述parser读取到的token串进行语法检查,通过ID解析器统计需查询元数据信息,生成抽象语法树;
根据所述需查询元数据信息,调用所述元数据组装模块确定待查询数据库对象;
将所述待查询数据库对象拼接成目标SQL,以通过目标数据库验证所述待查询数据库对象是否合法;
若合法,调用语义检查方法,遍历所述抽象语法树进行语义检查,得到中间语法树;
遍历所述中间语法树,调用源码解析所述中间语法树,生成目标语法树。
根据本发明提供的一种PL/SQL语言的语法解析方法,所述记录所述token串中出现的源数据库对象,得到元数据组装模块,包括:
记录所述token串中出现的源数据库对象;
确认所述源数据库对象对应的历史元数据信息;
对所述历史元数据信息进行组装,得到元数据组装模块。
根据本发明提供的一种PL/SQL语言的语法解析方法,所述对所述历史元数据信息进行组装,得到元数据组装模块,包括:
确定所述历史元数据信息的属性;
根据所述历史元数据信息的属性对所述历史元数据信息进行组装,得到元数据组装模块。
根据本发明提供的一种PL/SQL语言的语法解析方法,所述属性包括:column属性、package属性、procedure属性和function属性;
所述元数据组装模块包括:第一Map集合、第二Map集合、第三Map集合和第四Map集合;
对应的,所述根据所述历史元数据信息的属性对所述历史元数据信息进行组装,得到元数据组装模块,包括:
根据所述column属性,对所述历史元数据信息进行组装,得到第一Map集合;
根据所述package属性,对所述历史元数据信息进行组装,得到第二Map集合;
根据所述procedure属性,对所述历史元数据信息进行组装,得到第三Map集合;
根据所述function属性,对所述历史元数据信息进行组装,得到第四Map集合;
对所述第一Map集合、所述第二Map集合、所述第三Map集合和所述第四Map集合进行组装,得到元数据组装模块。
根据本发明提供的一种PL/SQL语言的语法解析方法,所述通过ID解析器统计需查询元数据信息,包括:
根据当前语法结构,确定待查询数据库对象的出现位置;
在所述待查询数据库对象的出现位置,统计需查询元数据信息。
根据本发明提供的一种PL/SQL语言的语法解析方法,所述通过目标数据库验证所述待查询数据库对象是否合法之后,还包括:
若不合法,则发出错误提示,以通知管理员进行修改。
根据本发明提供的一种PL/SQL语言的语法解析方法,所述调用源码解析所述中间语法树,生成目标语法树,包括:
确定所述中间语法树的嵌套外部过程和嵌套外部函数,并生成子语法树;
通过子树连接模块,将所述子语法树与所述中间语法树进行连接,得到目标语法树。
本发明还提供一种PL/SQL语言的语法解析装置,包括:
切割模块,用于根据预设语法规则将PL/SQL语言的源脚本切割为token串,并通过parser读取所述token串;
记录模块,用于记录所述token串中出现的源数据库对象,得到元数据组装模块;
统计模块,用于根据当前语法结构,对所述parser读取到的token串进行语法检查,通过ID解析器统计需查询元数据信息,生成抽象语法树;
确定模块,用于根据所述需查询元数据信息,调用所述元数据组装模块确定待查询数据库对象;
查询模块,用于将所述待查询数据库对象拼接成目标SQL,以通过目标数据库验证所述待查询数据库对象是否合法;
检查模块,用于若合法,调用语义检查方法,遍历所述抽象语法树进行语义检查,得到中间语法树;
生成模块,用于遍历所述中间语法树,调用源码解析所述中间语法树,生成目标语法树。
本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种所述PL/SQL语言的语法解析方法的步骤。
本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种所述PL/SQL语言的语法解析方法的步骤。
本发明提供的一种PL/SQL语言的语法解析方法及装置,方法通过根据预设语法规则将PL/SQL语言的源脚本切割为token串,并通过parser读取token串;记录token串中出现的源数据库对象,得到元数据组装模块;根据当前语法结构,对parser读取到的token串进行语法检查,通过ID解析器统计需查询元数据信息,生成抽象语法树;根据需查询元数据信息,调用元数据组装模块确定待查询数据库对象;将待查询数据库对象拼接成目标SQL,以通过目标数据库验证待查询数据库对象是否合法;若合法,调用语义检查方法,遍历抽象语法树进行语义检查,得到中间语法树;遍历中间语法树,调用源码解析中间语法树,生成目标语法树的方式,使得不必再每遇到一个语法结构便去确定数据库对象是否合法,而是将所有的需要验证的数据库对象进行统一的查询验证,减少了与目标数据库的交互次数,有效地提高了语法解析的效率。
附图说明
为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明提供的PL/SQL语言的语法解析方法的流程示意图;
图2为示例中抽象语法树的结构示意图;
图3为示例中中间语法树的结构示意图;
图4为示例中目标语法树的结构示意图;
图5是本发明提供的PL/SQL语言的语法解析装置的结构示意图;
图6是本发明提供的电子设备的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
下面结合图1-图3描述本发明的一种PL/SQL语言的语法解析方法及装置。
图1是本发明提供的PL/SQL语言的语法解析方法的流程示意图;
如图1所示,本实施例提供的一种PL/SQL语言的语法解析方法,包括以下步骤:
101、根据预设语法规则将PL/SQL语言的源脚本切割为token串,并通过parser读取token串。
具体的,通过预设语法规则将PL/SQL语言的源脚本切割为token串,也就是切割为源语言的低阶元素,然后通过解析器parser依次读取token串。
102、记录token串中出现的源数据库对象,得到元数据组装模块。
在对token串进行读取的过程中,会读取到所有的源脚本中的数据库对象。将出现过的所有的数据库对象进行记录,得到元数据组装模块,元数据与数据库对象为一一对应关系,即根据元数据便可以查到具体的是哪种数据库对象,例如:表、包、过程和函数等等。也就是说先将源脚本中的所有的数据库对象进行记录,使得便于后续查找。
具体的,首先记录token串中出现的源数据库对象,确认源数据库对象对应的历史元数据信息,也就是针对每一个源数据库对象,均确定其对应的元数据信息,将其定义为历史元数据信息,然后对历史元数据信息进行组装,得到元数据组装模块。其中,对历史元数据信息进行组装,得到元数据组装模块,包括:确定历史元数据信息的属性;根据历史元数据信息的属性对历史元数据信息进行组装,得到元数据组装模块。而属性包括:column属性、package属性、procedure属性和function属性;元数据组装模块包括:第一Map集合、第二Map集合、第三Map集合和第四Map集合。最终,根据历史元数据信息的属性对历史元数据信息进行组装,得到元数据组装模块,包括:根据column属性,对历史元数据信息进行组装,得到第一Map集合;根据package属性,对历史元数据信息进行组装,得到第二Map集合;根据procedure属性,对历史元数据信息进行组装,得到第三Map集合;根据function属性,对历史元数据信息进行组装,得到第四Map集合;对第一Map集合、第二Map集合、第三Map集合和第四Map集合进行组装,得到元数据组装模块。
103、根据当前语法结构,对parser读取到的token串进行语法检查,通过ID解析器统计需查询元数据信息,生成抽象语法树。
根据当前语法结构,对parser读取到的token串进行语法检查,确定需查询元数据信息,就是在token串中读取所有的需要进行查询的元数据信息。而通过ID解析器统计需查询元数据信息,包括:根据当前语法结构,确定待查询数据库对象的出现位置;根据语法结构以及数据库对象可以出现的位置,便可总结得到,每种语法结构可以出现的数据库对象,于是便可以准确的搜集到需要查询的元数据信息。比如:出现a这种结构,那么a只可能是表,过程函数后面必须紧跟左括号。如果出现a(),这种结构就不会是表。这类表达式基本都是以a或者a(...)中间以点组合而成的表达式。例如(a.b、a().b、a(b,c).d、a.b(c).d等)。其中,ID解析出来的语法树都是IDExpression,组合结构用List<XExpression>来描述,如果是a这种结构对应XIDExpression,a(...)这种结构对应XFunctionExpression。于是便可以在待查询数据库对象的出现位置,统计需查询元数据信息,也就是将需查询元数据信息进行统计,而不是一个一个的去验证,从而减小了与目标数据库的交互次数。语法检查后,不仅仅生成了抽象语法树,还统计得到了所有的需查询元数据信息。
104、根据需查询元数据信息,调用元数据组装模块确定待查询数据库对象。
在获取到需查询元数据信息后,调用元数据组装模块确定待查询数据库对象,也就是根据需查询元数据信息,在元数据组装模块中查询对应的数据库对象。查询的过程,可以是先确定需查询元数据的属性信息,根据属性信息,确定需查询元数据信息对应的Map集合,然后在对应的Map集合中查找需查询元数据信息对应的数据库对象。
105、将待查询数据库对象拼接成目标SQL,以通过目标数据库验证待查询数据库对象是否合法。
此时,获取到的待查询数据库对象可能是多条,然后将多条的数据库对象进行拼接为一条SQL,然后通过目标数据库验证待查询数据库对象是否合法。通过一条SQL进行查询验证,减少了验证的次数,有效地提高了验证效率。
106、若合法,调用语义检查方法,遍历抽象语法树进行语义检查,得到中间语法树。
若验证的结果,表示合法,则调用语义检查方法,遍历抽象语法树进行语义检查,将抽象语法树的部分分支生长出来,但不是完全生长出来,总体就是按照分层的思想,将语法树的分支一层一层的生长出来,通过语义检查之后,生成中间语法树。若不合法,则发出错误提示,以通知管理员进行修改。
107、遍历中间语法树,调用源码解析中间语法树,生成目标语法树。
由于在中间语法树中会嵌套结构,因此需要再次的遍历中间语法树,调用源码解析中间语法树,生成目标语法树。具体可以是确定中间语法树的嵌套外部过程和嵌套外部函数,并生成子语法树;通过子树连接模块,将子语法树与中间语法树进行连接,得到目标语法树。于是便得到了完整的语法树。
例如,以一段PL/SQL脚本的解析为例,说明上述步骤中各个模块的调用顺序,如图2-图4所示为目标语法树的生成过程。其中,fun、func是自定义函数,在可执行块(executeblock)中被调用。
解析器驱动词法分析器,将源脚本切割成token串,解析器parser依次读取token,根据当前语法结构,做语法检查。如果遇到需要查询的数据库对象,调用ID解析器,搜集元数据信息。首先会遇到t_table,根据结构会确定可能是表名为t_table,有表中有a_int这个字段,也可能是包名为t_table,a_int为包中的公共变量。所以会收集到两条信息,并产生语法树IDExpression,如图2中灰色部分。遇到func(num),这个结构,便只会收集到一条元数据信息,因为只可能是外部函数,并产生语法树IDExpression,因为没有数据库对象信息,所以只会产生语法树IDExpression来记录当前语句结构,不会完整的将调用的自定义函数的语法树连接出来。同理fun(m)也只会收集到一条元数据信息,并产生语法树IDExpression。遇到table1,会收集到表名为table1的数据库对象,因为当前语境中,只能出现表。解析产生抽象语法树之后,调用AseemblyMetadata模块中组装元数据,此时会将收集到待查询数据库对象,拼接成一条目标SQL,连接目标数据库并查询。有了元数据信息后,调用语义检查方法semanticCheck(),遍历语法树。如遇到图2中的IDExpression语法树,此时已经知道t_table是表,所以IDExpression语法树会变成typeEx语法树。如果t_table在数据库中不是表,那么报错。遇到XFun语法树,会将其变成funcall语法树,但是不会将funcall语法树中的fundeclare完整的长出来,于是便得到了如图3所示的中间语法树。最后通过源码调用解析才能得到对应的fundeclare语法树,通过子树连接模块(SyntaxTreeGenerator)便生成了如图4所示的目标语法树。
本实施例提供的一种PL/SQL语言的语法解析方法,通过根据预设语法规则将PL/SQL语言的源脚本切割为token串,并通过parser读取token串;记录token串中出现的源数据库对象,得到元数据组装模块;根据当前语法结构,对parser读取到的token串进行语法检查,通过ID解析器统计需查询元数据信息,生成抽象语法树;根据需查询元数据信息,调用元数据组装模块确定待查询数据库对象;将待查询数据库对象拼接成目标SQL,以通过目标数据库验证待查询数据库对象是否合法;若合法,调用语义检查方法,遍历抽象语法树进行语义检查,得到中间语法树;遍历中间语法树,调用源码解析中间语法树,生成目标语法树的方式,使得不必再每遇到一个语法结构便去确定数据库对象是否合法,而是将所有的需要验证的数据库对象进行统一的查询验证,减少了与目标数据库的交互次数,有效地提高了语法解析的效率。采用分层解析的方式,更加节省资源,加快了解析速度,更加模块化,实现了低耦合高内聚。
基于同一总的发明构思,本发明还保护一种PL/SQL语言的语法解析装置,下面对本发明提供的PL/SQL语言的语法解析装置进行描述,下文描述的PL/SQL语言的语法解析装置与上文描述的PL/SQL语言的语法解析方法可相互对应参照。
图5是本发明提供的PL/SQL语言的语法解析装置的结构示意图。
如图5所示,本实施例提供一种PL/SQL语言的语法解析装置,包括:
切割模块10,用于根据预设语法规则将PL/SQL语言的源脚本切割为token串,并通过parser读取token串;
记录模块20,用于记录token串中出现的源数据库对象,得到元数据组装模块;
统计模块30,用于根据当前语法结构,对parser读取到的token串进行语法检查,通过ID解析器统计需查询元数据信息,生成抽象语法树;
确定模块40,用于根据需查询元数据信息,调用元数据组装模块确定待查询数据库对象;
查询模块50,用于将待查询数据库对象拼接成目标SQL,以通过目标数据库验证待查询数据库对象是否合法;
检查模块60,用于若合法,调用语义检查方法,遍历抽象语法树进行语义检查,得到中间语法树;
生成模块70,用于遍历中间语法树,调用源码解析中间语法树,生成目标语法树。
本实施例提供的一种PL/SQL语言的语法解析装置,通过根据预设语法规则将PL/SQL语言的源脚本切割为token串,并通过parser读取token串;记录token串中出现的源数据库对象,得到元数据组装模块;根据当前语法结构,对parser读取到的token串进行语法检查,通过ID解析器统计需查询元数据信息,生成抽象语法树;根据需查询元数据信息,调用元数据组装模块确定待查询数据库对象;将待查询数据库对象拼接成目标SQL,以通过目标数据库验证待查询数据库对象是否合法;若合法,调用语义检查方法,遍历抽象语法树进行语义检查,得到中间语法树;遍历中间语法树,调用源码解析中间语法树,生成目标语法树的方式,使得不必再每遇到一个语法结构便去确定数据库对象是否合法,而是将所有的需要验证的数据库对象进行统一的查询验证,减少了与目标数据库的交互次数,有效地提高了语法解析的效率。
进一步的,本实施例中的记录模块20,具体用于:
记录所述token串中出现的源数据库对象;
确认所述源数据库对象对应的历史元数据信息;
对所述历史元数据信息进行组装,得到元数据组装模块。
进一步的,本实施例中的记录模块20中的步骤,所述对所述历史元数据信息进行组装,得到元数据组装模块,具体包括:
确定所述历史元数据信息的属性;
根据所述历史元数据信息的属性对所述历史元数据信息进行组装,得到元数据组装模块。
进一步的,本实施例中的所述属性包括:column属性、package属性、procedure属性和function属性;
所述元数据组装模块包括:第一Map集合、第二Map集合、第三Map集合和第四Map集合;
对应的,记录模块20中的步骤,所述根据所述历史元数据信息的属性对所述历史元数据信息进行组装,得到元数据组装模块,包括:
根据所述column属性,对所述历史元数据信息进行组装,得到第一Map集合;
根据所述package属性,对所述历史元数据信息进行组装,得到第二Map集合;
根据所述procedure属性,对所述历史元数据信息进行组装,得到第三Map集合;
根据所述function属性,对所述历史元数据信息进行组装,得到第四Map集合;
对所述第一Map集合、所述第二Map集合、所述第三Map集合和所述第四Map集合进行组装,得到元数据组装模块。
进一步的,本实施例中的统计模块30,具体用于:
根据当前语法结构,确定待查询数据库对象的出现位置;
在所述待查询数据库对象的出现位置,统计需查询元数据信息。
进一步的,本实施例中的检查模块60,具体还用于:
若不合法,则发出错误提示,以通知管理员进行修改。
进一步的,本实施例中的生成模块70,具体用于:
确定所述中间语法树的嵌套外部过程和嵌套外部函数,并生成子语法树;
通过子树连接模块,将所述子语法树与所述中间语法树进行连接,得到目标语法树。
关于上述装置部分的实施例,在对应的方法实施例中已经进行了详细的介绍,因此,在对应的装置部分不再进行具体阐述。
图6示例了一种电子设备的实体结构示意图,如图6所示,该电子设备可以包括:处理器(processor)610、通信接口(Communications Interface)620、存储器(memory)630和通信总线640,其中,处理器610,通信接口620,存储器630通过通信总线640完成相互间的通信。处理器610可以调用存储器630中的逻辑指令,以执行一种PL/SQL语言的语法解析方法,该方法包括:根据预设语法规则将PL/SQL语言的源脚本切割为token串,并通过parser读取token串;记录token串中出现的源数据库对象,得到元数据组装模块;根据当前语法结构,对parser读取到的token串进行语法检查,通过ID解析器统计需查询元数据信息,生成抽象语法树;根据需查询元数据信息,调用元数据组装模块确定待查询数据库对象;将待查询数据库对象拼接成目标SQL,以通过目标数据库验证待查询数据库对象是否合法;若合法,调用语义检查方法,遍历抽象语法树进行语义检查,得到中间语法树,遍历中间语法树,调用源码解析中间语法树,生成目标语法树。
此外,上述的存储器630中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法所提供的一种PL/SQL语言的语法解析方法,该方法包括:根据预设语法规则将PL/SQL语言的源脚本切割为token串,并通过parser读取token串;记录token串中出现的源数据库对象,得到元数据组装模块;根据当前语法结构,对parser读取到的token串进行语法检查,通过ID解析器统计需查询元数据信息,生成抽象语法树;根据需查询元数据信息,调用元数据组装模块确定待查询数据库对象;将待查询数据库对象拼接成目标SQL,以通过目标数据库验证待查询数据库对象是否合法;若合法,调用语义检查方法,遍历抽象语法树进行语义检查,得到中间语法树;遍历中间语法树,调用源码解析中间语法树,生成目标语法树。
又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各提供的一种PL/SQL语言的语法解析方法,该方法包括:根据预设语法规则将PL/SQL语言的源脚本切割为token串,并通过parser读取token串;记录token串中出现的源数据库对象,得到元数据组装模块;根据当前语法结构,对parser读取到的token串进行语法检查,通过ID解析器统计需查询元数据信息,生成抽象语法树;根据需查询元数据信息,调用元数据组装模块确定待查询数据库对象;将待查询数据库对象拼接成目标SQL,以通过目标数据库验证待查询数据库对象是否合法;若合法,调用语义检查方法,遍历抽象语法树进行语义检查,得到中间语法树;遍历中间语法树,调用源码解析中间语法树,生成目标语法树。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (7)
1.一种PL/SQL语言的语法解析方法,其特征在于,包括:
根据预设语法规则将PL/SQL语言的源脚本切割为token串,并通过parser读取所述token串;
记录所述token串中出现的源数据库对象,得到元数据组装模块;根据当前语法结构,对所述parser读取到的token串进行语法检查,通过ID解析器统计需查询元数据信息,生成抽象语法树;
根据所述需查询元数据信息,调用所述元数据组装模块确定待查询数据库对象;
将所述待查询数据库对象拼接成目标SQL,以通过目标数据库验证所述待查询数据库对象是否合法;
若合法,调用语义检查方法,遍历所述抽象语法树进行语义检查,得到中间语法树;
遍历所述中间语法树,调用源码解析所述中间语法树,生成目标语法树;
其中,所述记录所述token串中出现的源数据库对象,得到元数据组装模块,包括:
记录所述token串中出现的源数据库对象;
确认所述源数据库对象对应的历史元数据信息;
对所述历史元数据信息进行组装,得到元数据组装模块;
针对每一个源数据库对象,均确定其对应的元数据信息,将其定义为历史元数据信息,然后对历史元数据信息进行组装,得到元数据组装模块;其中,对历史元数据信息进行组装,得到元数据组装模块,包括:确定历史元数据信息的属性;根据历史元数据信息的属性对历史元数据信息进行组装,得到元数据组装模块;而属性包括:column属性、package属性、procedure属性和function属性;元数据组装模块包括:第一Map集合、第二Map集合、第三Map集合和第四Map集合;最终,根据历史元数据信息的属性对历史元数据信息进行组装,得到元数据组装模块,包括:根据column属性,对历史元数据信息进行组装,得到第一Map集合;根据package属性,对历史元数据信息进行组装,得到第二Map集合;根据procedure属性,对历史元数据信息进行组装,得到第三Map集合;根据function属性,对历史元数据信息进行组装,得到第四Map集合;对第一Map集合、第二Map集合、第三Map集合和第四Map集合进行组装,得到元数据组装模块。
2.根据权利要求1所述的PL/SQL语言的语法解析方法,其特征在于,所述通过ID解析器统计需查询元数据信息,包括:
根据当前语法结构,确定待查询数据库对象的出现位置;
在所述待查询数据库对象的出现位置,统计需查询元数据信息。
3.根据权利要求1所述的PL/SQL语言的语法解析方法,其特征在于,所述通过目标数据库验证所述待查询数据库对象是否合法之后,还包括:
若不合法,则发出错误提示,以通知管理员进行修改。
4.根据权利要求1所述的PL/SQL语言的语法解析方法,其特征在于,所述调用源码解析所述中间语法树,生成目标语法树,包括:
确定所述中间语法树的嵌套外部过程和嵌套外部函数,并生成子语法树;
通过子树连接模块,将所述子语法树与所述中间语法树进行连接,得到目标语法树。
5.一种PL/SQL语言的语法解析装置,其特征在于,包括:
切割模块,用于根据预设语法规则将PL/SQL语言的源脚本切割为token串,并通过parser读取所述token串;
记录模块,用于记录所述token串中出现的源数据库对象,得到元数据组装模块;
统计模块,用于根据当前语法结构,对所述parser读取到的token串进行语法检查,通过ID解析器统计需查询元数据信息,生成抽象语法树;
确定模块,用于根据所述需查询元数据信息,调用所述元数据组装模块确定待查询数据库对象;
查询模块,用于将所述待查询数据库对象拼接成目标SQL,以通过目标数据库验证所述待查询数据库对象是否合法;
检查模块,用于若合法,调用语义检查方法,遍历所述抽象语法树进行语义检查,得到中间语法树;
生成模块,用于遍历所述中间语法树,调用源码解析所述中间语法树,生成目标语法树;
其中,所述记录所述token串中出现的源数据库对象,得到元数据组装模块,包括:
记录所述token串中出现的源数据库对象;
确认所述源数据库对象对应的历史元数据信息;
对所述历史元数据信息进行组装,得到元数据组装模块;
针对每一个源数据库对象,均确定其对应的元数据信息,将其定义为历史元数据信息,然后对历史元数据信息进行组装,得到元数据组装模块;其中,对历史元数据信息进行组装,得到元数据组装模块,包括:确定历史元数据信息的属性;根据历史元数据信息的属性对历史元数据信息进行组装,得到元数据组装模块;而属性包括:column属性、package属性、procedure属性和function属性;元数据组装模块包括:第一Map集合、第二Map集合、第三Map集合和第四Map集合;最终,根据历史元数据信息的属性对历史元数据信息进行组装,得到元数据组装模块,包括:根据column属性,对历史元数据信息进行组装,得到第一Map集合;根据package属性,对历史元数据信息进行组装,得到第二Map集合;根据procedure属性,对历史元数据信息进行组装,得到第三Map集合;根据function属性,对历史元数据信息进行组装,得到第四Map集合;对第一Map集合、第二Map集合、第三Map集合和第四Map集合进行组装,得到元数据组装模块。
6.一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至4任一项所述PL/SQL语言的语法解析方法的步骤。
7.一种非暂态计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至4任一项所述PL/SQL语言的语法解析方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110779112.1A CN113468873B (zh) | 2021-07-09 | 2021-07-09 | Pl/sql语言的语法解析方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110779112.1A CN113468873B (zh) | 2021-07-09 | 2021-07-09 | Pl/sql语言的语法解析方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113468873A CN113468873A (zh) | 2021-10-01 |
CN113468873B true CN113468873B (zh) | 2024-04-16 |
Family
ID=77879545
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110779112.1A Active CN113468873B (zh) | 2021-07-09 | 2021-07-09 | Pl/sql语言的语法解析方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113468873B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114579203B (zh) * | 2022-03-07 | 2024-03-15 | 网易(杭州)网络有限公司 | 脚本文件检查方法、装置、电子设备及存储介质 |
CN115497477B (zh) * | 2022-09-09 | 2024-07-16 | 平安科技(深圳)有限公司 | 语音交互方法、语音交互装置、电子设备、存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2017120087A1 (en) * | 2016-01-08 | 2017-07-13 | Microsoft Technology Licensing, Llc | Database operation using metadata of data sources |
CN106951430A (zh) * | 2016-12-28 | 2017-07-14 | 金蝶软件(中国)有限公司 | 账表查询方法及装置 |
CN108052635A (zh) * | 2017-12-20 | 2018-05-18 | 江苏瑞中数据股份有限公司 | 一种异构数据源统一联合查询方法 |
CN112035508A (zh) * | 2020-08-27 | 2020-12-04 | 深圳天源迪科信息技术股份有限公司 | 基于sql在线元数据解析的方法及系统、设备 |
-
2021
- 2021-07-09 CN CN202110779112.1A patent/CN113468873B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2017120087A1 (en) * | 2016-01-08 | 2017-07-13 | Microsoft Technology Licensing, Llc | Database operation using metadata of data sources |
CN106951430A (zh) * | 2016-12-28 | 2017-07-14 | 金蝶软件(中国)有限公司 | 账表查询方法及装置 |
CN108052635A (zh) * | 2017-12-20 | 2018-05-18 | 江苏瑞中数据股份有限公司 | 一种异构数据源统一联合查询方法 |
CN112035508A (zh) * | 2020-08-27 | 2020-12-04 | 深圳天源迪科信息技术股份有限公司 | 基于sql在线元数据解析的方法及系统、设备 |
Also Published As
Publication number | Publication date |
---|---|
CN113468873A (zh) | 2021-10-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN113468873B (zh) | Pl/sql语言的语法解析方法及装置 | |
EP1027648B1 (en) | Apparatus for semi-automated generation and application of language conformity tests | |
US9122540B2 (en) | Transformation of computer programs and eliminating errors | |
CN109522225B (zh) | 一种自动化测试断言方法及装置、测试平台及存储介质 | |
US8838440B2 (en) | Generating parser combination by combining language processing parsers | |
US8676826B2 (en) | Method, system and program storage device for automatic incremental learning of programming language grammar | |
US20020100022A1 (en) | Method and apparatus for automatic verification of properties of a concurrent software system | |
JP2013522790A (ja) | アバップソースコードのコード検査遂行システム | |
RU2010111118A (ru) | Конечный автомат унифицированного обмена сообщениями | |
CN116450616A (zh) | 一种基于解析树的通用异构关系型数据库sql迁移方法 | |
CN112988163B (zh) | 编程语言智能适配方法、装置、电子设备和介质 | |
CN113901083B (zh) | 基于多解析器的异构数据源操作资源解析定位方法和设备 | |
CN111813675A (zh) | Ssa结构解析方法、装置、电子设备和存储介质 | |
Uhl et al. | An attribute grammar for the semantic analysis of Ada | |
CN116842042A (zh) | 异化数据库的通用方法、装置、电子设备及存储介质 | |
CN115357235A (zh) | 基于表单的业务规则配置方法及装置 | |
WO2021259367A1 (zh) | 统一sql的方法、系统、设备及介质 | |
US20030196195A1 (en) | Parsing technique to respect textual language syntax and dialects dynamically | |
CN112948419A (zh) | 查询语句处理方法及装置 | |
EP4242832A1 (en) | Method and apparatus for parsing programming language, and non-volatile storage medium | |
CN115292347A (zh) | 一种基于规则的主动式sql算法性能检查装置及方法 | |
Anderson et al. | Supporting analysis of SQL queries in PHP AiR | |
CN111381826A (zh) | 生成代码文件的语法树的方法、装置及电子设备 | |
CN112799638B (zh) | 无侵入式快速开发方法、平台、终端及存储介质 | |
Arusoaie et al. | Automating abstract syntax tree construction for context free grammars |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |