生成统一AST的方法、装置、计算机设备和存储介质
技术领域
本发明公开涉及计算机技术领域,具体而言,涉及一种生成统一AST的方法、装置、计算机设备和存储介质。
背景技术
Apache Thrift和Protocol buffers是目前最流行的RPC(远程过程调用,RemoteProcedure Call)框架,分别用Thrift文件和Proto文件来描述RPC接口。Thrift文件和Proto文件都属于IDL(接口描述语言,Interface description language)文件。IDL文件与编程语言无关,可以和各种编程语言建立映射关系。IDL文件不仅可以当成文档来协助沟通,还可以用来生成各种编程语言的接口代码。
IDL文件虽然是为RPC接口而设计的,经过扩展之后也可以用来描述HTTP(超文本传输协议,Hyper Text Transfer Protocol)接口。经过扩展之后的IDL文件可以用来实现各种自动化功能,比如生成接口请求代码,生成接口模拟代码和生成自然语言版的接口文档。
实现自动化的过程一般分为2步:首先根据IDL文件生成AST(抽象语法树,Abstract Syntax Code),然后根据AST生成目标产物。由于IDL文件有2种,所以生成的AST也有两种,生成目标产物时也需要开发和维护两套代码,成本非常高。另外,经过扩展之后的IDL文件没有使用IDL文件的全部功能,有一部分功能是不被使用的,但是生成的AST仍然包含这些不被使用的冗余信息。
发明内容
本公开实施例至少提供一种生成统一AST的方法、装置、计算机设备和存储介质,在生成的统一AST中过滤掉不被使用的冗余信息,降低开发和维护成本。
第一方面,本公开实施例提供了一种生成统一AST的方法,其特征在于,包括:
获取待处理接口描述语言IDL文件;
解析获取的待处理IDL文件得到所述IDL文件对应的抽象语法树AST;
遍历解析得到的AST中包含的属性,根据预先定义的统一AST结构将当前遍历的属性转化为所述统一AST结构中对应的属性,所述统一AST结构中包含需要的属性及其依赖的属性。
一种可选的实施方式中,统一AST结构中包括域名空间namespace、引用文件路径includes和语句statements。
一种可选的实施方式中,所述待处理IDL文件包括Thrift文件;以及
解析获取的待处理IDL文件得到所述IDL文件对应的抽象语法树AST,具体包括:
解析所述Thrift文件得到Thrift AST,其中,所述Thrift AST属性包括域名空间namespace、引用文件路径include和语句;以及
遍历解析得到的AST中包含的属性,根据预先定义的统一AST结构将当前遍历的属性转化为统一AST结构中对应的属性,具体包括:
遍历所述Thrift AST中包含的属性,将所述Thrift AST中的namespace转化为所述统一AST结构中的namespace;
将所述Thrift AST中的include转化为所述统一AST结构中的includes;
将所述Thrift AST语句中定义的类型转化为所述统一AST结构中statements定义的类型。
一种可选的实施方式中,如果所述Thrift AST中不包含namespace,则所述方法,还包括:
确定所述Thrift文件的绝对路径为所述统一AST结构中的namespace。
一种可选的实施方式中,所述Thrift AST语句中定义的类型包括共用体类型union;以及
将所述Thrift AST语句中定义的类型转化为所述统一AST结构中statements定义的类型,包括:
将所述Thrift AST语句中定义的union类型转化为所述统一AST结构中statements定义的struct类型。
一种可选的实施方式中,所述Thrift AST语句中定义的类型包括标识符类型identifier;所述identifier中包括文件名引用值;以及
将所述Thrift AST语句中定义的类型转化为所述统一AST结构中statements定义的类型,包括:
根据所述Thrift AST中的include,确定所述Thrift文件的引用文件;
解析获取的引用文件得到所述引用文件对应的Thrift AST;
根据所述引用文件对应的Thrift AST,确定引用文件的文件名和namespace的映射关系;
根据所述identifier中包括的文件名引用值以及确定出的引用文件的文件名和namespace的映射关系得到域名引用值。
一种可选的实施方式中,所述待处理IDL文件包括Proto文件;以及
解析获取的待处理IDL文件得到所述IDL文件对应的抽象语法树AST,具体包括:
解析获取的Proto文件得Proto AST,其中,所述Proto AST属性包括包package、导入import和语句;以及
遍历解析得到的AST中包含的属性,根据预先定义的统一AST结构将当前遍历的属性转化为统一AST结构中对应的属性,具体包括:
遍历所述Proto AST中包含的属性,将所述Proto AST中的package转化为所述统一AST结构中对应的namespace;
将所述Proto AST中的import转化为所述统一AST结构中的includes;
将所述Proto AST语句中定义的类型转化为所述统一AST结构中statements定义的类型。
一种可选的实施方式中,如果所述Proto AST中不包含package,则所述方法,还包括:
确定所述Proto文件的绝对路径为所述统一AST结构中的namespace。
一种可选的实施方式中,所述Proto AST语句中定义的类型包括重复类型repeated和映射类型map;以及
将所述Proto AST语句中定义的类型转化为所述统一AST结构中statements定义的类型,包括:
将所述Proto AST语句中定义的repeated类型和map类型分别转化为所述统一AST结构中statements定义的list类型和map类型。
一种可选的实施方式中,所述Proto AST语句中定义的类型包括标识符类型identifier;所述identifier中包括域名引用值;以及
将所述Proto AST语句中定义的类型转化为所述统一AST结构中statements定义的类型,包括:
根据所述Proto AST中的import,确定所述Proto文件的引用文件;
解析获取的引用文件得到所述引用文件对应的Proto AST;
根据所述引用文件对应的Proto AST,确定引用文件的namespace和文件名的映射关系;
根据所述identifier中包括的域名引用值以及确定出的引用文件的namespace和文件名的映射关系得到文件名引用值。
第二方面,本公开实施例还提供一种生成统一AST的装置,包括:
获取单元,用于获取待处理接口描述语言IDL文件;
解析单元,用于解析获取的待处理IDL文件得到所述IDL文件对应的抽象语法树AST;
转化单元,用于遍历解析得到的AST中包含的属性,根据预先定义的统一AST结构将当前遍历的属性转化为所述统一AST结构中对应的属性,所述统一AST结构中包含需要的属性及其依赖的属性。
一种可选的实施方式中,统一AST结构中包括域名空间namespace、引用文件路径includes和语句statements。
一种可选的实施方式中,所述待处理IDL文件包括Thrift文件;以及
所述解析单元,具体用于解析所述Thrift文件得到Thrift AST,其中,所述ThriftAST属性包括域名空间namespace、引用文件路径include和语句;
所述转化单元,具体用于遍历所述Thrift AST中包含的属性,将所述Thrift AST中的namespace转化为所述统一AST结构中的namespace;将所述Thrift AST中的include转化为所述统一AST结构中的includes;将所述Thrift AST语句中定义的类型转化为所述统一AST结构中statements定义的类型。
一种可选的实施方式中,所述转化单元,还用于当所述Thrift AST中不包含namespace时,确定所述Thrift文件的绝对路径为所述统一AST结构中的namespace。
一种可选的实施方式中,所述Thrift AST语句中定义的类型包括共用体类型union;以及
所述转化单元,具体用于将所述Thrift AST语句中定义的union类型转化为所述统一AST结构中statements定义的struct类型。
一种可选的实施方式中,所述Thrift AST语句中定义的类型包括标识符类型identifier;所述identifier中包括文件名引用值;以及
所述转化单元,具体用于根据所述Thrift AST中的include,确定所述Thrift文件的引用文件;解析获取的引用文件得到所述引用文件对应的Thrift AST;根据所述引用文件对应的Thrift AST,确定引用文件的文件名和namespace的映射关系;根据所述identifier中包括的文件名引用值以及确定出的引用文件的文件名和namespace的映射关系得到域名引用值。
一种可选的实施方式中,所述待处理IDL文件包括Proto文件;以及
所述解析单元,具体用于解析所述的Proto文件得到Proto AST,其中,所述ProtoAST属性包括包package、导入import和语句;
所述转化单元,具体用于遍历所述Proto AST中包含的属性,将所述Proto AST中的package转化为所述统一AST结构中的namespace;将所述Proto AST中的import转化为所述统一AST结构中的includes;将所述Proto AST语句中定义的类型转化为所述统一AST结构中statements定义的类型。
一种可选的实施方式中,所述转化单元,还用于当所述Proto AST中不包含package时,确定所述Proto文件的绝对路径为所述统一AST结构中的namespace。
一种可选的实施方式中,所述Proto AST语句中定义的类型包括重复类型repeated和映射类型map;以及
所述转化单元,具体用于将所述Proto AST语句中定义的repeated类型和map类型分别转化为所述统一AST结构中statements定义的list类型和map类型。
一种可选的实施方式中,所述Proto AST语句中定义的类型包括标识符类型identifier;所述identifier中包括域名引用值;以及
所述转化单元,具体用于根据所述Proto AST中的import,确定所述Proto文件的引用文件;解析获取的引用文件得到所述引用文件对应的Proto AST;根据所述引用文件对应的Proto AST,确定引用文件的namespace和文件名的映射关系;根据所述identifier中包括的域名引用值以及确定出的引用文件的namespace和文件名的映射关系得到文件名引用值。
第三方面,本公开实施例还提供一种计算机设备,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当计算机设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
第四方面,本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
关于上述一种生成统一AST的装置、电子设备、及计算机可读存储介质的效果描述参见上述一种生成统一AST的方法的说明,这里不再赘述。
本公开实施例提供的一种生成统一AST的方法、装置、计算机设备和介质,通过预先定义兼容不同类型IDL文件的核心信息的统一AST结构,将不同类型的IDL文件的AST结构转化为统一的AST结构,与现有技术中将不同类型的IDL文件分别生成不同AST的方式相比,只需要开发和维护一套代码,能有效降低开发和维护成本;而且统一AST结构仅包含需要的属性及其依赖的属性,过滤掉了不被使用的冗余信息。
为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
为了更清楚地说明本公开实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,此处的附图被并入说明书中并构成本说明书中的一部分,这些附图示出了符合本公开的实施例,并与说明书一起用于说明本公开的技术方案。应当理解,以下附图仅示出了本公开的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1示出了本公开实施例所提供的一种生成统一AST方法的流程图;
图2示出了本公开实施例所提供的一种生成统一AST方法中,Thrift AST转化成统一AST具体方法的应用流程图;
图3示出了本公开实施例所提供的一种生成统一AST方法中,Proto AST转化成统一AST具体方法的应用流程图;
图4示出了本公开实施例所提供的一种生成统一AST装置的示意图;
图5示出了本公开实施例所提供的一种计算机设备的示意图。
具体实施方式
首先,对本发明实施例中涉及的部分用语进行说明,以便于本领域技术人员理解。
Thrift,全名叫做Apache Thrift,是一种接口描述语言和二进制通讯协议,被用来定义和创建跨语言的服务,是一个跨语言的服务部署框架。
Thrift文件,用户通过Thrift的IDL(接口描述语言)来描述接口函数及数据类型,然后通过Thrift的编译环境生成各种语言类型的接口文件,用户可以根据自己的需要采用不同的语言开发客户端代码和服务器端代码。
Protocol Buffers,是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化,很适合做数据存储或RPC数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
Proto文件,用于定义程序中需要处理的结构化数据。
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
经研究发现,由于IDL文件包含Thrift文件和Proto文件2种,所以生成的AST也有两种,生成目标产物时也需要开发和维护两套代码,成本非常高。另外,经过扩展之后的IDL文件没有使用IDL文件的全部功能,有一部分功能不被使用,但是生成的AST仍然包含这些不被使用的冗余信息。
基于上述研究,本公开提供了一种生成统一AST的方法、装置、计算机设备和介质,生成的统一AST兼容了Thrift文件和Proto文件的核心信息,过滤掉了不被需要的冗余信息。基于统一AST实现各种自动化功能时,只需要开发和维护一套代码,能有效降低开发和维护成本。
针对以上方案所存在的缺陷,均是发明人在经过实践并仔细研究后得出的结果,因此,上述问题的发现过程以及下文中本公开针对上述问题所提出的解决方案,都应该是发明人在本公开过程中对本公开做出的贡献。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
为便于对本实施例进行理解,首先对本公开实施例所公开的一种生成统一AST的方法进行详细介绍,本公开实施例所提供的一种生成统一AST方法的执行主体一般为具有一定计算能力的计算机设备,该计算机设备例如包括:终端设备或服务器或其它处理设备,终端设备可以为用户设备(User Equipment,UE)、移动设备、用户终端、终端、蜂窝电话、无绳电话、个人数字处理(Personal Digital Assistant,PDA)、手持设备、计算设备、车载设备、可穿戴设备等。在一些可能的实现方式中,该生成统一AST的方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。
下面以执行主体为具有一定计算能力的计算机设备为例对本公开实施例提供的一种生成统一AST的方法加以说明。
实施例一
为了兼容不同类型的IDL文件的核心信息于一体,过滤不被使用的冗余信息,有效降低开发和维护成本,本公开实施例中,通过预先定义统一AST(抽象语法树,AbstractSyntax Code)的结构,遍历并转化解析文件后得到的AST中的属性,最终将遍历转化结果整合到统一AST的结构中,此后只需要开发和维护一套代码,能有效降低开发和维护成本。
需要说明的是,不同类型的IDL文件可以但不仅限于包括Thrift文件和Proto文件,为了便于描述以下实施例中以Thrift文件和Proto文件为例进行说明。
在定义统一AST结构时,可以保留需要的类型及其依赖的类型,去掉不需要的类型,转化类似类型。因此,根据本申请定义的统一AST结构中包含需要的属性及其依赖的属性。比如,Thrift中的struct(结构体)是需要的类型,应该保留。typedef(类型定义)不是需要的类型,但是会被struct依赖,所以也应该保留。exception是不需要的类型,可以去掉。union(共用体类型)是和struct类似的类型,在统一AST结构中,其可以转化成struct。另外,定义统一AST时,还需要兼容Thrift文件和Proto文件的差异。例如,Thrift文件通过文件名来引用其他文件的类型,而Proto文件通过域名来引用其他文件的类型,所以,统一AST结构应该同时支持文件名引用和域名引用。
在一种实施方式中,统一AST的顶层结构可以包括namespace(域名空间)、includes(引用文件路径)和statements(语句)三个属性,其中,namespace指域名空间,includes是一个数组,元素为引用文件路径,statements是一个数组,元素为statement(语句)。
在统一AST的分层结构中,statement包括typedef(类型定义)、enum(枚举)、const(常量)、struct(结构体)、service(服务)和function(函数)。
分层结构中的struct字段和function的参数为字段类型。其中,字段类型包括base(基本类型)、list(集合类型)、map(映射类型)和identifier(标识符类型)。其中,base包括string(字符串类型)、float(浮点数类型)、int8(8位整型)、int16(16位整型)、int32(32位整型)、int64(64位整型)、bool(布尔类型)、binary(二进制类型);identifier包括namesapceReferValue(域名引用值)和filenameReferValue(文件名引用值)。
在一个实施例中,统一AST结构示例如下:
另外,由于在IDL文件中,namespace不是必须定义的,为了防止命名冲突,本公开实施例中,在定义统一AST结构的过程中统一定义命名空间。对于原IDL文件未定义namesapce的情况,使用IDL文件的绝对路径来代替。
其中,Thrift文件通过文件名来引用其他文件,当前文件并不包含文件名对应的namespace信息,所以需要通过解析引用文件来获得引用文件的文件名和域名的映射关系,进而得到域名引用信息。
而Proto文件通过域名来引用其他文件,当前文件并不包含域名对应的文件名信息,所以需要通过解析引用文件来获得引用文件的namespace和文件名的映射关系,进而得到文件名引用信息。
基于上述预先定义的统一AST结构,参见图1所示,为本公开实施例一提供的一种生成统一AST方法的流程图,所述方法包括步骤S101~S103,其中:
S101:获取待处理IDL文件。
在本步骤中,待处理IDL文件包含两种,分别为Thrift文件和Proto文件。
S102:解析获取的待处理IDL文件得到所述IDL文件对应的AST。
本步骤中,用预设解析函数栈对所述IDL文件进行解析得到抽象语法树。例如,预设解析函数栈由一个或多个解析函数构成,每个解析函数均可以针对一种IDL文件中的语法规则进行解析,解析函数可以根据IDL文件的语法规则预先编写。为了解析IDL文件,可以预先编写好解析IDL文件中各种语法规则的解析函数,从而针对其中一个语法规则,解析函数栈中至少存在一个解析函数可以解析出其语法结构。
具体地,解析过程即从IDL文件中识别语法结构的过程,得到语法节点,语法节点可以为一个函数声明,一个静态全局变量的声明,一个文件的引入等。
可以理解,语法规则可以嵌套,例如,一个函数声明对应的语法节点中包含对一个文件的引入,从而文件引入的语法节点为函数声明的语法节点的子节点,函数声明的语法节点为文件引入的语法节点的父节点。类似这种父节点和子节点构成树形结构,即抽象语法树。
具体实施时,为了提高通用性和减少开发成本,还可以使用官方或社区的解析器解析待处理IDL文件得到相应的AST。
S103:遍历解析得到的AST中包含的属性,根据预先定义的统一AST结构将当前遍历的属性转化为统一AST结构中对应的属性。
本步骤中,根据解析后的AST结构以及预先定义的统一AST结构,将解析后得到的AST结构中包含的各个属性分别转化为统一AST结构中对应的属性。
通过上述步骤S101~S103可以将不同种类的IDL文件转化为统一的AST结构,在转化为统一AST结构的过程中,过滤不需要的冗余信息,此后无需针对不同类型的IDL文件分别维护代码,只需要开发和维护一套代码,有效降低了开发和维护成本。
为了更好理解本公开实施例,以下分别以Thrift文件和Proto文件为例,对本公开实施例的实施过程进行说明。
实施例二
实施例二对Thrift文件转化为统一AST的流程做进一步描述,在Thrift文件中,通过namespace定义域名,通过include定义文件引用,在语句中定义了不同的类型,例如,typedef、enum、struct、service、function和union等,根据本公开实施例需要把这些定义转化成统一AST对应的结构。另外,Thrift文件通过文件名来引用其他文件的类型,但当前文件并不包含文件名对应的namespace信息,所以需要通过解析引用文件来获得引用文件的文件名和namespace的映射关系,进而得到域名引用信息。参见图2所示,其为根据Thrift文件生成统一AST结构的实施流程示意图,可以包括以下步骤:
S201:获取待处理Thrift文件。
S202:解析Thrift文件得到Thrift AST。
其中,对于Thrift文件,解析得到的Thrift AST中包括namespace(域名空间)、include(引用文件路径)和语句三个属性。在语句中定义了不同的类型,例如,typedef、enum、struct、service、function和union等,struct的字段和function的参数为字段类型,字段类型中包含identifier,identifier包含namesapceReferValue(域名引用值)和filenameReferValue(文件名引用值)。
S203:遍历Thrift AST中包含的属性。
S204:判断Thrift AST中是否存在namespace,如果是,执行步骤S205,如果否,执行步骤S206。
本步骤中,由于Thrift文件中namespace不是必须定义的,因此针对Thrift AST中是否存在namespace作出判断。若判断结果为是,则顺序执行S205;若判断结果为否,则顺序执行S206。
S205:将Thrift AST中的namespace转化为统一AST结构中的namespace,并执行步骤S207。
S206:确定Thrift文件的绝对路径为统一AST结构中的namespace。
S207:将Thrift AST语句中定义的类型转化为统一AST结构中的statements定义的类型。
本步骤中,Thrift AST语句中定义的类型包括typedef、enum、struct、service、function和union等。
具体实施时,遍历Thrift AST语句中定义的类型,将typedef对应转化为统一AST结构中的statements定义的类型typedef,将enum对应转化为统一AST结构中的statements定义的类型enum,将struct对应转化为统一AST结构中的statements定义的类型struct,将service对应转化为统一AST结构中的statements定义的类型service,将function对应转化为统一AST结构中的statements定义的类型function,将union对应转化为统一AST结构中的statements定义的类型struct。
S208:将Thrift AST中的include转化为统一AST结构中的includes。本步骤中,可以根据include解析引用文件,得到引用文件对应的Thrift AST;根据引用文件对应的Thrift AST,确定引用文件的文件名和namespace的映射关系;具体实施时,Thrift AST语句中定义的类型还包括identifier;identifier中包括文件名引用值。根据identifier中包括的文件名引用值以及本步骤中确定出的引用文件的文件名和namespace的映射关系得到统一AST结构中的域名引用值。
实施例三
实施例三对Proto文件转化为统一AST的流程做进一步描述,在Proto文件中,通过package定义域名,通过import定义文件引用,通过message定义结构体,通过method定义函数,需要把这些定义转化成统一AST对应的结构。Proto文件通过域名来引用其他文件的类型,但当前文件并不包含域名对应的文件名信息,所以需要通过解析引用文件来获得引用文件的namespace和文件名的映射关系,进而得到文件名引用信息。参见图3,其为根据Proto文件生成统一AST结构的实施流程图,可以包括以下步骤:
S301:获取待处理Proto文件。
S302:解析Proto文件得到Proto AST。
本步骤中,解析Proto文件的实施流程与步骤S102中解析IDL文件的实施流程相同,其具体实施方式可以参见步骤S102的实施,这里不再赘述。
S303:遍历Proto AST中包含的属性。
S304:判断Proto AST中是否存在package,如果是,执行步骤S305,否则,执行步骤S306。
本步骤中,由于Proto文件中package不是必须定义的,因此针对Proto AST中是否存在package作出判断。若判断结果为是,则顺序执行S305;若判断结果为否,则顺序执行S306。
S305:将Proto AST中的package转化为统一AST结构中的namespace,并执行步骤S307。
S306:确定Proto文件的绝对路径为统一AST结构中的namespace。
S307:将Proto AST语句中定义的类型转化为统一AST结构中的statements定义的类型。
本步骤中,Proto AST语句中定义的类型包括enum、message、service、method、repeated和map对应转化为统一AST结构中的statements定义的类型enum、struct、service、function、list和map。
S308:将Proto AST中的import转化为统一AST结构中的includes。
本步骤中,可以根据import解析引用文件,得到引用文件对应的Proto AST;根据引用文件对应的Proto AST,确定引用文件的namespace和文件名的映射关系;Proto AST语句中定义的类型包括identifier;identifier中包括域名引用值。进一步地,根据identifier中包括的域名引用值以及确定出的引用文件的namespace和文件名的映射关系得到文件名引用值。
本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
基于同一发明构思,本公开实施例中还提供了与一种生成统一AST的方法对应的一种生成统一AST的装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述一种生成统一AST的方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
实施例四
参照图4所示,为本公开实施例四提供的生成统一AST装置的示意图,所述装置包括:
获取单元401,用于获取待处理接口描述语言IDL文件;
解析单元402,用于解析获取的待处理IDL文件得到所述IDL文件对应的抽象语法树AST;
转化单元403,用于遍历解析得到的AST中包含的属性,根据预先定义的统一AST结构将当前遍历的属性转化为统一AST结构中对应的属性,统一AST结构中包含需要的属性及其依赖的属性。
一种可能的实施方式中,统一AST结构中包括域名空间namespace、引用文件路径includes和语句statements。
一种可能的实施方式中,所述待处理IDL文件包括Thrift文件;以及
解析单元402,具体用于解析Thrift文件得到Thrift AST,其中,Thrift AST属性包括域名空间namespace、引用文件路径include和语句;
转化单元403,具体用于遍历Thrift AST中包含的属性,将Thrift AST中的namespace转化为统一AST结构中的namespace;将Thrift AST中的include转化为统一AST结构中的includes;将Thrift AST语句中定义的类型转化为统一AST结构中statements定义的类型。
一种可能的实施方式中,转化单元403,还用于当所述Thrift AST中不包含namespace时,确定Thrift文件的绝对路径为统一AST结构中的namespace。
一种可能的实施方式中,Thrift AST语句中定义的类型包括共用体类型union;以及
转化单元403,具体用于将Thrift AST语句中定义的union类型转化为统一AST结构中statements定义的struct类型。
一种可能的实施方式中,Thrift AST语句中定义的类型包括标识符类型identifier;identifier中包括文件名引用值;以及
转化单元403,具体用于根据Thrift AST中的include,确定Thrift文件的引用文件;解析获取的引用文件得到引用文件对应的Thrift AST;根据引用文件对应的ThriftAST,确定引用文件的文件名和namespace的映射关系;根据identifier中包括的文件名引用值以及确定出的引用文件的文件名和namespace的映射关系得到域名引用值。
一种可能的实施方式中,待处理IDL文件包括Proto文件;以及
解析单元402,具体用于解析的Proto文件得到Proto AST,其中,Proto AST属性包括包package、导入import和语句;
转化单元403,具体用于遍历Proto AST中包含的属性,将Proto AST中的package转化为统一AST结构中的namespace;将Proto AST中的import转化为统一AST结构中的includes;将Proto AST语句中定义的类型转化为统一AST结构中statements定义的类型。
一种可能的实施方式中,转化单元403,还用于当Proto AST中不包含package时,确定Proto文件的绝对路径为统一AST结构中的namespace。
一种可能的实施方式中,Proto AST语句中定义的类型包括重复类型repeated和映射类型map;以及
转化单元403,具体用于将Proto AST语句中定义的repeated类型和map类型分别转化为统一AST结构中statements定义的list类型和map类型。
一种可能的实施方式中,Proto AST语句中定义的类型包括标识符类型identifier;identifier中包括域名引用值;以及
转化单元403,具体用于根据Proto AST中的import,确定Proto文件的引用文件;解析获取的引用文件得到引用文件对应的Proto AST;根据引用文件对应的Proto AST,确定引用文件的namespace和文件名的映射关系;根据identifier中包括的域名引用值以及确定出的引用文件的namespace和文件名的映射关系得到文件名引用值。
关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
实施例五
基于同一技术构思,本申请实施例还提供了一种计算机设备。参照图5所示,为本申请实施例提供的计算机设备的结构示意图,包括处理器501、存储器502、和总线503。其中,存储器502用于存储执行指令,包括内存5021和外部存储器5022;这里的内存5021也称内存储器,用于暂时存放处理器501中的运算数据,以及与硬盘等外部存储器5022交换的数据,处理器501通过内存5021与外部存储器5022进行数据交换,当计算机设备运行时,处理器501与存储器502之间通过总线503通信,使得处理器501在执行上述方法实施例中所提及的执行指令。
本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的一种生成统一AST的方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
本公开实施例所提供的一种生成统一AST的方法的计算机程序产品,包括存储了程序代码的计算机可读存储介质,所述程序代码包括的指令可用于执行上述方法实施例中所述的一种生成统一AST的方法的步骤,具体可参见上述方法实施例,在此不再赘述。
本公开实施例还提供一种计算机程序,该计算机程序被处理器执行时实现前述实施例的任意一种方法。该计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(Software DevelopmentKit,SDK)等等。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。