一种源代码转换方法、装置及设备与流程

文档序号:14688034发布日期:2018-06-15 06:48阅读:753来源:国知局

本申请涉及计算机技术领域,尤其涉及一种源代码转换方法、装置及设备。



背景技术:

JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。。

现有技术中,前端开发人员进行开发工作是需要用到大量的JavaScript源代码,为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。

然而,前端开发者通常需要通过HTML文档来描述网页布局结构,然后通过JavaScript代码调用DOM API(Document Object Model Application Programming Interface)或辅助库的API(Application Programming Interface)来操作变更HTML结构,这个实现过程很容易造成代码混杂而导致难以维护扩展。



技术实现要素:

本说明书实施例提供一种源代码转换方法、装置及设备,以解决现有技术中开发人员使用JavaScript源代码实现功能时,因语法规则较为复杂所导致工作效率较低的问题。

本说明书实施例提供的一种源代码转换方法,所述方法包括:

根据JSX源代码字符串构造第一抽象语法树;

重构第一抽象语法树的树结构和节点属性,得到第二抽象语法树;

将所述第二抽象语法树解析为JavaScript源代码字符串。

基于同样思想,本说明书实施例还提供的一种源代码转换装置,所述装置包括:

构造模块,用于根据JSX源代码字符串构造第一抽象语法树;

重构模块,用于重构第一抽象语法树的树结构和节点属性,得到第二抽象语法树;

解析模块,用于将所述第二抽象语法树解析为JavaScript源代码字符串。

此外,本说明书实施例还提供的一种源代码转换设备,包括:

存储器,存储源代码转换程序;

通讯接口,接收第一语法树的构造请求;

处理器,在通讯接口接收到第一语法树的构造请求后,调用存储器中存储的源代码转换程序,并执行:

根据JSX源代码字符串构造第一抽象语法树;

重构第一抽象语法树的树结构和节点属性,得到第二抽象语法树;

将所述第二抽象语法树解析为JavaScript源代码字符串。

本说明书实施例采用的上述至少一个技术方案能够达到以下有益效果:

本说明书通过将符合JSX源代码字符串转换为JavaScript源代码字符串,实现了不同类型源代码间的转换;通过上述方法,开发人员可以仅通过编写语法规则较为简单的JSX源代码,即可实现现有技术中JavaScript源代码可实现的功能,避免了开发人员工作效率较低的问题,进而缩短开发周期;与此同时。前段开发人员也无需学习复杂的语法规则,即可快速高效的完成开发工作,降低了学习成本。

附图说明

此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1为本说明书实施例提供的源代码转换过程示意图;

图2为本说明书实施例提供的源代码转换方法流程图;

图3为本说明书实施例提供的另一种源代码转换方法流程图;

图4为本说明书实施例提供的另一种源代码转换方法流程图;

图5为本说明书实施例提供的源代码转换装置结构示意图。

具体实施方式

为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

在本说明书中的一个或多个实施例中,源代码转换方法可以应用于将JSX(JavaScript XML)源代码字符串转换为JavaScript源代码的过程。具体转换过程如图1所示,其中,JSX源代码用于表示JSX源代码字符串,AST(abstractsyntax tree)用于表示第一抽象语法树,AST Transformed用于表示第二抽象语法树,JavaScript源代码用于表示JavaScript源代码字符串。

具体的,所述的JSX源代码字符串可以是符合JSX源语法规则的代码,用于在执行过程中,将JSX源代码字符串转换为JS源(JavaScript)代码字符串。JSX语法规则可以由开发人员预先设定,该语法规则为简单易学,且结构简洁,与JS源代码的语法相比,可以极大的降低学习成本和开发成本。

本说明书实施例中提供一种源代码转换方法,具体执行过程可如图2所示,具体包括以下步骤:

步骤S201:根据JSX源代码字符串构造第一抽象语法树。

本实施例中,所述源代码转换方法可以由客户端执行,也可以由服务器执行。进一步的,本实施例中所述的源代码转换方法可以根据前端开发人员编辑完成的JSX代码转换为可以实现同样功能的JS代码,可以将前端开发人员编辑完成的JSX代码转换为可以实现同样功能的JS代码,进而直接转换并执行,以实现动态页面中所需的交互功能。

具体的,JSX语法规则可以看作是由JavaScript和XML语法相互结合形成一种语法规则,其使用XML标记的方式直接声明界面组件,并且界面组件之间可以互相嵌套。可以理解为一种定义带属性树结构(DOM结构)的语法,它的目的不是要在浏览器或者引擎中实现,而是通过各种编译器将这些标记编译成标准的JS代码。

所述第一抽象语法树即框架图中的AST,是JSX代码字符串的抽象语法结构的树状表现形式,该第一抽象语法树用于牢牢抓住程序的脉络,从而方便编译过程的后续环节(如代码生成)对程序进行解读。所述第一抽象语法树的每个节点都表示JSX代码字符串中一种结构,之所以说抽象,是因为第一抽象语法树并不会表示出真实语法出现的每一个细节,比如说,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现。

具体的,在第一抽象语法树的构造过程中,首先需要对JSX代码字符串中的每一个字符进行拆分,形成一个个独立的词法单元,与此同时,遍历拆分完成的每一个词法单元,并逐个添加到第一抽象语法树中的各节点中,得到最终的第一抽象语法树。其中,语法单元是被转换语法当中具备实际意义的最小单元。

在上述实施例的基础上,可以对拆分完成的词法单元进行词法分析,把词法单元进行立体的组合,以明确多个词法单元之间的关系。具体的,语义分析的过程又是个遍历语法单元的过程,不过相比较而言更复杂,因为分词过程中,每个语法单元都是独立平铺的,而语法分析中,语句和表达式会以树状的结构互相包含。

可选的,所述第一抽象语法树的中的词法单元可以是空白、数字、注释、标识符和运算符中的任意一种。

步骤S203:重构第一抽象语法树的树结构和节点属性,得到第二抽象语法树。

本实施中,开发人员可以预先规定第一抽象语法树和第二抽象语法树中对应节点之间的映射关系,从而根据该映射关系重构第一抽象语法树的树结构和节点属性。

可以选择的,本实施例可以将该映射关系可以预先存储于映射库中,从而在执行过程中通过查找映射库中来插入、移动、替换或删除第一抽象语法树中各个节点。

其中,各节点的节点属性,可以包括上述过程中拆分完成的词法单元。例如,词法单元包括各种类型的JSX标签、标签属性和标签子元素。不同类型内容的词法单元可以对应于字段替换规则中的子规则,进而根据对应的字段替换子规则将替换词法单元。

本实施例中,在重构第一抽象语法树的过程中,可以在对第一抽象语法树进行遍历的过程中执行,直至对所有节点完成遍历,各节点属性的修改操作也随之结束,进而得到了第二抽象语法树。其中,第二抽象语法树用于被解析为JavaScript源代码字符串。

步骤S205:将所述第二抽象语法树解析为JavaScript源代码字符串。

具体的,解析第二抽象语法树的过程中,还可以递归遍历第二抽象语法树,并根据第二抽象语法树中各节点之间的关系以及JavaScript源语法规则重新构造JavaScript源代码字符串。

本说明书实施例中在上述实施例的基础上提供另一种源代码转换方法,如图3所示,具体包括以下步骤:

步骤S300:从源代码段中筛选JSX源代码字符串。

本实施中所述源代码转换方法中,可以将代码段中的JSX源代码部分自动转换为JS源代码。其中,源代码段中可以是不同编程语言的源代码组成。

以所述代码段为包括JSX源代码部分的html网页为例展开叙述,源代码转换装置可以先对html网页中的源代码进行扫描识别,发现JSX源代码字符串特有标签时,则将该特有标签的头标签和尾标签中代码部分筛选(或截取出来)时,作为本实施所述的JSX源代码字符串。这样设置的好处在于,开发人员可以将包含各种类型的代码块作为输入,源代码转换方法智能且自动化的将代码段中包括的JSX源代码部分转换为JS源代码,提高代码可维护性,减低开发成本。

步骤S302:根据JSX源代码字符串构造第一抽象语法树。

步骤S304:遍历所述第一抽象语法树。

具体的,所述第一抽象语法树的遍历顺序包括但不限于先序遍历、后序遍历和中序遍历。

步骤S306:按照遍历顺序依次修改所述第一抽象语法树的树结构和节点属性,得到第二抽象语法树;其中,所述修改操作包括插入、移动、替换或删除操作。

本实施例中,构造第一抽象语法树中各节点的字段值的过程的同时,还可以验证语法单元的正确性,进而精准地分析以及进行代码结构的调整。

步骤S308:将所述第二抽象语法树解析为JavaScript代码字符串。

此外,本说明书实施例中在上述实施例的基础上提供另一种源代码转换方法,如图4所示,具体包括:

步骤S401:封装树节点修改算法至预置接口中。

其中,所述树节点修改算法用于实现修改树结构和节点属性,预置接口可以是预先开发完毕的一个或多个接口对象,本实施例中,可以将树节点修改算法封装为预置接口的function,这样设置的好处在于提高代码可维护性,减低开发成本。

步骤S403:根据JSX源代码字符串构造第一抽象语法树;

步骤S405:针对第一抽象语法树中任意一个节点,以节点属性作为调用参数调用预置接口,得到节点属性替换值。

本实施例中,在对第一抽象语法树中各节点的节点属性进行替换时,会将节点属性作为调用参数输入至预置接口中对应的function,并将被调用function的输出作为节点属性替换值。

具体的,同一节点属性可以分为多个调用参数输入至预置接口的function中,例如,所述预置接口可以包括A.createElement API,可以将节点属性中包括的标签属性和标签子元素作为调用参数输入至createElement API,进而得到节点属性替换值。

步骤S407:利用所述节点属性替换值替换所述节点属性。

步骤S409:返回执行预置接口的调用操作,直至完成第一抽象语法树的重构操作。

本实施例中,针对第一抽象语法树中的每个节点,都需要调用至少一次预置接口获取节点属性替换值,直至完成全部节点的节点属性的替换操作。

步骤S411:将所述第二抽象语法树解析为JavaScript源代码字符串。

以上为本申请提供的源代码转换方法的几种实施例,基于同样的思路,本申请还提供了源代码转换装置的实施例,如图5所示,本说明书实施例还提供一种源代码转换装置,所述装置包括:

构造模块,用于根据JSX源代码字符串构造第一抽象语法树;

重构模块,用于重构第一抽象语法树的树结构和节点属性,得到第二抽象语法树;

解析模块,用于将所述第二抽象语法树解析为JavaScript源代码字符串。

在上述实施例的基础上,所述重构模块,还可用于遍历所述第一抽象语法树;按照遍历顺序依次修改所述第一抽象语法树的树结构和节点属性,得到第二抽象语法树;其中,所述修改操作包括插入、移动、替换或删除操作。

在上述实施例的基础上,所述源代码转换装置还包括封装模块,用于封装节点修改算法至预置接口中;重构模块还可用于,针对第一抽象语法树中任意一个节点,以节点属性作为调用参数,调用预置接口,得到节点属性替换值;利用所述节点属性替换值替换所述节点属性;返回执行预置接口的调用操作,直至完成第一抽象语法树的重构操作。

在上述实施例的基础上,源代码转换装置还包括筛选模块,用于从源代码段中筛选JSX源代码字符串。

在上述实施例的基础上,所述第一抽象语法树的遍历顺序包括但不限于先序遍历、后序遍历和中序遍历。

此外,本说明书实施例在还提供一种源代码转换设备,包括:

存储器,存储源代码转换程序;

通讯接口,接收第一语法树的构造请求;

处理器,在通讯接口接收到第一语法树的构造请求后,调用存储器中存储的源代码转换程序,并执行:

根据JSX源代码字符串构造第一抽象语法树;

重构第一抽象语法树的树结构和节点属性,得到第二抽象语法树;

将所述第二抽象语法树解析为JavaScript源代码字符串。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、设备和介质类实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可,这里就不再一一赘述。

上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤或模块可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。

在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device,PLD)(例如现场可编程门阵列(Field Programmable Gate Array,FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware Description Language)、Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL(Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL(Ruby Hardware Description Language)等,目前最普遍使用的是VHDL(Very-High-Speed Integrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。

控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。

上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。

为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。

本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信编号和载波。

还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。

本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定事务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行事务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利范围之中。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1