首页> 中国专利> 使用领域专用语言的自定义逻辑方法、系统和可读介质

使用领域专用语言的自定义逻辑方法、系统和可读介质

摘要

本申请提供了一种使用领域专用语言的自定义逻辑方法、系统和计算机可读介质。该方法包括:接收用户输入的原始代码和原始代码的函数类型,其中原始代码使用基于TypeScript语言的预设的领域专用语言,其中预设的领域专用语言的语法包括第一预设语法和第二预设语法;将TypeScript声明文件注册到编译器中;将原始代码转换成抽象语法树;根据TypeScript声明文件验证原始代码;根据第二预设语法验证抽象语法树的函数类型与用户输入的原始代码的函数类型是否一致;根据第一预设语法对抽象语法树进行转换;根据抽象语法树输出可执行脚本。该方法能够用较低的用户学习成本实现自定义复杂逻辑并且适用于规模较大的系统。

著录项

  • 公开/公告号CN112231068A

    专利类型发明专利

  • 公开/公告日2021-01-15

    原文格式PDF

  • 申请/专利权人 浙江太美医疗科技股份有限公司;

    申请/专利号CN202011499549.1

  • 发明设计人 杨涛;鲍勇翔;

    申请日2020-12-18

  • 分类号G06F9/455(20060101);G06F8/30(20180101);G06F8/41(20180101);

  • 代理机构31100 上海专利商标事务所有限公司;

  • 代理人骆希聪

  • 地址 314000 浙江省嘉兴市经济技术开发区昌盛南路36号智慧产业创新园9号楼3层

  • 入库时间 2023-06-19 09:35:27

说明书

技术领域

本申请主要涉及计算机技术领域,尤其涉及一种使用领域专用语言的自定义逻辑方法、系统和计算机可读介质。

背景技术

用户在使用系统中的功能时,常常会遇到系统默认的处理流程或者逻辑无法满足用户需求这一问题。在这种情况下,用户需要通过自定义逻辑来实现自己所需要的功能,但是系统中可以进行编程定制化的功能是有限制的。因此,系统通过把整体的逻辑分成一个一个不可分割的最小逻辑单元给用户使用,用户通过对逻辑进行自由组合来实现个性化需求。因此,逻辑编排是指用户基于系统提供的定制化功能,按照自己的需求重新排列组合逻辑单元。

在现有技术中,用户想要实现自定义逻辑通常有2种方法。最常见的处理方法是通过通用编程语言实现,例如Java、JavaScript、C#等编程语言,系统只需提供一个库给用户调用即可。通用编程语言方式能够实现复杂逻辑的定义。但对于普通用户来说,通用编程语言的学习成本很高。用户为了使用系统还需要学习一门编程语言,使用难度太大。

另一种方法是通过可视化方式实现逻辑编排,例如流程图等可视化方式。这种可视化自定义逻辑的方式在近些年越来越流行,是为了解决通用编程语言上手成本过高的问题。在一个示例中,图形化的编排方式可以把参数处理、服务调用、结果处理等抽象成一个处理器,然后用户可以用if、while等逻辑语句来实现自定义处理器的流程。但是,图形化自定义逻辑的方式难以实现复杂的逻辑编排。并且随着系统规模增大到一定程度后,用户的使用成本会随着系统功能的增多而快速上升,此时继续使用图形化方式会反而会比编程方式需要更高的使用成本。

因此,本领域技术人员亟需一种自定义逻辑方法,能够用较低的用户学习成本实现自定义复杂逻辑,并且用户使用成本不会随着系统规模的扩大而快速上升,适用于较大规模的系统。

发明内容

本申请要解决的技术问题是提供一种使用领域专用语言的自定义逻辑方法、系统和计算机可读介质,能够用较低的用户学习成本实现自定义复杂逻辑并且适用于规模较大的系统。

为解决上述技术问题,本申请提供了一种使用领域专用语言的自定义逻辑方法,运行于JavaScript虚拟机中,包括:接收用户输入的原始代码和所述原始代码的函数类型,其中所述原始代码使用基于TypeScript语言的预设的领域专用语言,其中所述预设的领域专用语言的语法包括第一预设语法和第二预设语法,所述第一预设语法用于还原异步操作,所述第二预设语法用于判断函数类型;将TypeScript声明文件注册到所述TypeScript编译器中,其中所述TypeScript声明文件包含所述预设的领域专用语言的语法规则,所述TypeScript声明文件包括以下任意一个或多个:系统逻辑单元声明文件、工具逻辑单元声明文件和第一自定义逻辑单元声明文件;将所述原始代码转换成相应的抽象语法树;基于所述TypeScript编译器根据所述TypeScript声明文件验证所述原始代码,若验证不通过则输出错误信息并结束;根据所述第二预设语法验证所述抽象语法树的函数类型与所述用户输入的所述原始代码的函数类型是否一致,若不一致则输出错误信息并结束;根据所述第一预设语法对所述抽象语法树进行转换;根据转换后的抽象语法树输出相应的可执行的JavaScript脚本和第二自定义逻辑单元声明文件;以及将所述第二自定义逻辑单元声明文件加入所述第一自定义逻辑单元声明文件。

在本申请的一实施例中,所述预设的领域专用语言的语法还包括预设翻译语法,所述方法还包括:根据所述预设翻译语法翻译所述转换后的抽象语法树,并输出翻译结果供用户查看。

在本申请的一实施例中,所述根据所述第一预设语法对所述抽象语法树进行转换由Babel编译器执行;所述根据所述第一预设语法对所述抽象语法树进行转换包括:遍历所述抽象语法树中的所有函数并判断每个函数是否为异步函数,若是则为所述函数增加await关键字,若否则不为所述函数增加await关键字;以及为所述抽象语法树添加相应的包装函数体,并判断所述抽象语法树中的每个函数是否增加了所述await关键字,若是则为所述函数添加async关键字,若否则不为所述函数添加async关键字。

在本申请的一实施例中,所述根据所述第二预设语法验证所述抽象语法树的函数类型与所述用户输入的所述原始代码的函数类型是否一致由Babel编译器执行;所述根据所述第二预设语法验证所述抽象语法树的函数类型与所述用户输入的所述原始代码的函数类型是否一致包括:通过所述Babel编译器的遍历模块寻找返回状态类型,并判断所述用户输入的原始代码的函数类型;当所述用户输入的所述原始代码的函数类型为条件类型时,若找不到所述返回状态类型则验证不通过,若找到所述返回状态类型,则判断所述返回状态类型的参数是否为Boolean类型,若为Boolean类型则验证通过,若不为Boolean类型则验证不通过;当所述用户输入的所述原始代码的函数类型为计算类型时,若找不到所述返回状态类型则验证通过,若找到所述返回状态类型则验证不通过;以及当所述用户输入的所述原始代码的函数类型为动作类型时,若找到所述返回状态类型则验证通过,若找不到所述返回状态类型则验证不通过。

在本申请的一实施例中,所述方法还运行于TypeScript编辑器中,其中所述TypeScript编辑器包括编辑框;所述接收用户输入的原始代码和所述原始代码的函数类型是接收所述TypeScript编辑器发送的用户输入的所述原始代码和所述原始代码的函数类型;所述方法还包括:将所述TypeScript声明文件注册到所述TypeScript编辑器中;响应于用户的输入请求,加载所述编辑框;接收用户在所述编辑框中输入的原始代码和所述原始代码的函数类型;将所述原始代码转换成相应的抽象语法树;根据所述TypeScript声明文件验证所述抽象语法树,若验证不通过则输出错误信息并结束;以及响应于用户的保存请求,将所述原始代码、所述原始代码的函数类型和所述TypeScript声明文件发送至所述TypeScript编译器。

在本申请的一实施例中,所述方法还包括:当用户在所述编辑框中输入所述原始代码时,根据用户当前输入的内容在所述TypeScript声明文件中进行匹配,并在所述编辑框中展现匹配结果以对用户进行逻辑单元提示。

在本申请的一实施例中,所述TypeScript编辑器包含第一报错函数和第二报错函数,其中所述第一报错函数为所述TypeScript编辑器自带的报错函数,所述第二报错函数为预设自定义报错函数,用于根据所述错误信息判断错误是否与所述第二预设语法相关;所述方法还包括:当出现所述错误信息时,调用所述第二报错函数根据所述错误信息判断错误是否与所述第二预设语法相关;若相关,则消除所述错误信息;以及若不相关,则调用所述第一报错函数,并将所述错误消息发送给所述第一报错函数。

在本申请的一实施例中,所述错误信息包括错误提示消息和错误位置信息,其中所述错误提示消息用于在所述编辑框中提示用户出现错误,所述错误位置信息用于在所述编辑框中提示用户错误所在的位置。

在本申请的一实施例中,在所述将TypeScript声明文件注册到所述TypeScript编译器中之前,所述方法还包括:接收所述TypeScript编辑器发送的所述TypeScript声明文件。

为解决上述技术问题,本申请还提供了一种使用领域专用语言的自定义逻辑系统,包括:存储器,用于存储可由处理器执行的指令;以及处理器,用于执行所述指令以实现如上所述的方法。

为解决上述技术问题,本申请还提供了一种存储有计算机程序代码的计算机可读介质,所述计算机程序代码在由处理器执行时实现如上所述的方法。

与现有技术相比,本申请的使用领域专用语言的自定义逻辑方法、系统和计算机可读介质通过使用DSL语言来实现用户自定义逻辑,能够让普通用户用较低的学习成本实现对复杂逻辑进行自定义。并且,当系统规模扩大到一定程度时,DSL语言仍能具有较高的使用效率,用户的使用成本不会随着系统规模的扩大而快速上升,非常适用于较大规模的系统。

附图说明

包括附图是为提供对本申请进一步的理解,它们被收录并构成本申请的一部分,附图示出了本申请的实施例,并与本说明书一起起到解释本申请原理的作用。附图中:

图1是根据本申请一实施例示出的使用领域专用语言的自定义逻辑方法的流程示意图;

图2是根据本申请一实施例示出的步骤105的实现方法的流程示意图;

图3是根据本申请一实施例示出的步骤106的实现方法的流程示意图;

图4和图5是根据本申请另一实施例示出的使用领域专用语言的自定义逻辑方法的流程示意图;

图6是根据本申请一实施例示出的逻辑单元提示的界面示意图;

图7是根据本申请一实施例示出的使用领域专用语言的自定义逻辑方法的报错流程示意图;

图8是根据本申请一实施例示出的使用领域专用语言的自定义逻辑系统的系统框图。

具体实施方式

为了更清楚地说明本申请的实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单的介绍。显而易见地,下面描述中的附图仅仅是本申请的一些示例或实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图将本申请应用于其他类似情景。除非从语言环境中显而易见或另做说明,图中相同标号代表相同结构或操作。

如本申请和权利要求书中所示,除非上下文明确提示例外情形,“一”、“一个”、“一种”和/或“该”等词并非特指单数,也可包括复数。一般说来,术语“包括”与“包含”仅提示包括已明确标识的步骤和元素,而这些步骤和元素不构成一个排它性的罗列,方法或者设备也可能包含其他的步骤或元素。

除非另外具体说明,否则在这些实施例中阐述的部件和步骤的相对布置、数字表达式和数值不限制本申请的范围。同时,应当明白,为了便于描述,附图中所示出的各个部分的尺寸并不是按照实际的比例关系绘制的。对于相关领域普通技术人员已知的技术、方法和设备可能不作详细讨论,但在适当情况下,所述技术、方法和设备应当被视为授权说明书的一部分。在这里示出和讨论的所有示例中,任何具体值应被解释为仅仅是示例性的,而不是作为限制。因此,示例性实施例的其它示例可以具有不同的值。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步讨论。

本申请中使用了流程图用来说明根据本申请的实施例的系统所执行的操作。应当理解的是,前面或下面操作不一定按照顺序来精确地执行。相反,可以按照倒序或同时处理各种步骤。同时,或将其他操作添加到这些过程中,或从这些过程移除某一步或数步操作。

本申请提供了一种使用领域专用语言的自定义逻辑方法,运行于JavaScript虚拟机中。图1是根据本申请一实施例示出的使用领域专用语言的自定义逻辑方法的流程示意图。如图1所示,本实施例的使用领域专用语言的自定义逻辑方法包括以下步骤101-108:

步骤101,接收用户输入的原始代码和原始代码的函数类型,其中原始代码使用基于TypeScript语言的预设的领域专用语言,其中预设的领域专用语言的语法包括第一预设语法和第二预设语法,第一预设语法用于还原异步操作,第二预设语法用于判断函数类型;

步骤102,将TypeScript声明文件注册到TypeScript编译器中,其中TypeScript声明文件包含预设的领域专用语言的语法规则,TypeScript声明文件包括以下任意一个或多个:系统逻辑单元声明文件、工具逻辑单元声明文件和第一自定义逻辑单元声明文件;

步骤103,将原始代码转换成相应的抽象语法树;

步骤104,基于TypeScript编译器根据TypeScript声明文件验证原始代码,若验证不通过则输出错误信息并结束;

步骤105,根据第二预设语法验证抽象语法树的函数类型与用户输入的原始代码的函数类型是否一致,若不一致则输出错误信息并结束;

步骤106,根据第一预设语法对抽象语法树进行转换;

步骤107,根据转换后的抽象语法树输出相应的可执行的JavaScript脚本和第二自定义逻辑单元声明文件;以及

步骤108,将第二自定义逻辑单元声明文件加入第一自定义逻辑单元声明文件。

上述步骤101-108运行于JavaScript虚拟机中,在一个示例中JavaScript虚拟机可以为Node.js,Node.js是一个基于Chrome V8引擎的JavaScript运行时。下面对步骤101-108进行详细说明:

在步骤101中,用户使用基于TypeScript语言的预设的领域专用语言来进行原始代码的输入,并且用户输入该原始代码的函数类型,然后自定义逻辑系统接收用户所输入的原始代码以及原始代码的函数类型。

领域专用语言(Domain-Specific Language, DSL),又称领域特定语言,指的是专注于某个应用程序领域的计算机语言。不同于普通的跨领域通用计算机语言(GPL),领域特定语言只用在某些特定的领域。比如用来显示网页的HTML,以及Emacs所使用的Emac LISP语言。本申请中所提到的DSL语言,是以TypeScript为基础语言,去掉了一些普通用户(指不具备专业编程能力的人员)难以理解和掌握的语法,并加入能让普通用户方便使用的语法规则,是针对特定场景以及特定系统预先专门设计的DSL语言。需要注意的是,本领域技术人员可以在没有脱离本申请精神的情况下设计出适用于其他特定场景以及特定系统的DSL语言,本申请对此不作限定。

本实施例中的预设的领域专用语言的语法至少包括第一预设语法和第二预设语法,其中第一预设语法用于在后续步骤中还原异步操作,第二预设语法用于在后续步骤中判断函数类型。

在步骤102中,系统将TypeScript声明文件注册到TypeScript编译器中。TypeScript声明文件包含预设的领域专用语言的一部分语法规则,且不包含第一预设语法和第二预设语法。TypeScript声明文件包括以下任意一个或多个:系统逻辑单元声明文件、工具逻辑单元声明文件和第一自定义逻辑单元声明文件。逻辑单元是指可以执行的最小不可分割的逻辑,属于语法的一部分。也就是说,预设的领域专用语言的语法规则可以以逻辑单元的形式保存于TypeScript声明文件中。TypeScript声明文件是d.ts文件(TypeScriptDeclaration File),是TypeScript中的定义文件。相应地,系统逻辑单元声明文件、工具逻辑单元声明文件和第一自定义逻辑单元声明文件可以分别是system.d.ts文件、tools.d.ts文件和custom.d.ts文件。

系统逻辑单元是指一个特定系统独有的逻辑单元,全部系统逻辑单元可以全都存放在一个系统逻辑单元声明文件中。工具逻辑单元是指常用工具类逻辑,工具类逻辑可以应用于其它系统中,不仅限于一个特定系统中使用,全部工具逻辑单元可以全都存放在一个工具逻辑单元声明文件中。自定义逻辑单元是用户自定义逻辑生成的逻辑单元,全部自定义逻辑单元可以全都存放在一个自定义逻辑单元声明文件中。在上述三种逻辑单元保存于TypeScript声明文件中并注册到TypeScript编译器后,逻辑单元中的语法规则会作为预设的领域专用语言的语法规则的一部分供用户直接使用,用户不需要导入(import)也不需要进行定义。通过将逻辑单元分为以上三类,能够简单快捷地对逻辑单元进行管理和使用。

在步骤103中,系统将原始代码转换成相应的抽象语法树。系统不能对原始代码验证是否符合第一预设语法或第二预设语法,因此需要将原始代码转换成相应的抽象语法树后再进行第一预设语法验证或第二预设语法验证。

在步骤104中,系统基于TypeScript编译器根据TypeScript声明文件来对原始代码进行验证,若验证不通过则输出错误信息并结束。因为TypeScript声明文件包含预设的领域专用语言的一部分语法规则,系统需要验证原始代码是否符合TypeScript声明文件所包含的语法。若验证通过,即原始代码符合TypeScript声明文件所包含的语法时,系统继续执行下一步骤;若验证不通过,即原始代码不符合TypeScript声明文件所包含的语法时,系统不继续执行下一步骤,而是输出错误信息并结束。步骤103和步骤104的顺序可互相调换,即步骤104可以在步骤103之前执行,本申请对此不作限定。

在步骤105中,第二预设语法用于判断代码的函数类型,系统根据预设DSL语言的第二预设语法验证抽象语法树的函数类型与用户输入的原始代码的函数类型是否一致。若验证一致时,则可以确认用户输入的原始代码的函数类型正确,系统继续执行下一步骤;若验证不一致时,则可以确认用户输入的原始代码的函数类型有误,系统不继续执行下一步骤,而是输出错误信息并结束。

在本申请的一实施例中,步骤105可以由Babel编译器执行。图2是根据本实施例示出的步骤105的实现方法的流程示意图。如图2所示,步骤105的根据第二预设语法验证抽象语法树的函数类型与用户输入的原始代码的函数类型是否一致可以包括以下步骤201-204:

步骤201,系统通过Babel编译器的遍历模块(@babel/traverse)寻找返回状态类型(ReturnStatement);

步骤202,判断用户输入的原始代码的函数类型;

步骤203,当用户输入的原始代码的函数类型为条件类型时,若找不到返回状态类型则验证不通过,若找到返回状态类型,则判断返回状态类型的参数是否为Boolean类型,若为Boolean类型则验证通过,若不为Boolean类型则验证不通过;

步骤204,当用户输入的原始代码的函数类型为计算类型时,若找不到返回状态类型则验证通过,若找到返回状态类型则验证不通过;以及

步骤205,当用户输入的原始代码的函数类型为动作类型时,若找到返回状态类型则验证通过,若找不到返回状态类型则验证不通过。

通过上述步骤201-205可以在Babel编译器中使用遍历模块对抽象语法树的函数类型与用户所输入的函数类型是否一致进行验证。步骤201和202的顺序可互相调换,本申请不对此作限定。

在步骤106中,第一预设语法用于还原异步操作,系统根据第一预设语法对抽象语法树进行转换并得到转换后的抽象语法树。因为通常来说,JavaScript中的异步操作需要使用callback或者是async/await的方式,而掌握上述异步操作的使用方式对于普通用户来说较难,普通用户的学习成本很高。因此通过使用用于还原异步操作的第一预设语法,能够让普通用户不需要掌握异步操作的关键字就能直接使用异步操作,大幅度地降低了用户的学习成本,提高了用户自定义逻辑的效率。

在本申请的一实施例中,步骤106可以由Babel编译器执行。图3是根据本申请一实施例示出的步骤106的实现方法的流程示意图。如图3所示,步骤106的根据第一预设语法对抽象语法树进行转换可以包括以下步骤301-302:

步骤301,遍历抽象语法树中的所有函数并判断每个函数是否为异步函数,若是则为该函数增加await关键字,若否则不为该函数增加await关键字;以及

步骤302,为抽象语法树添加相应的包装函数体,并判断抽象语法树中的每个函数是否增加了await关键字,若是则为该函数添加async关键字,若否则不为该函数添加async关键字。

下面以一具体示例说明上述步骤301-302。如下所示代码是用户所输入的一段原始代码:

let title, body, to;

const item = dataPoint.getItem();

title = item.isUpdated()

`SAE Added!! ` :

`SAE Updated!!! `;

body = generateBody(item);

switch (subject.environmentId) {

case '4028e43d5b7f3ff9015b7f422e100001':

to = "user_dev@mdsol.com";

break;

default:

to = "user_any@mdsol.com";

}

context.sendEmailToAddress([to], title, body);

上述原始代码在步骤103中被转换成相应的抽象语法树。但需要特别说明的是,步骤301-302的执行对象为抽象语法树,而不是上述原始代码。为了便于阅读和理解,此处略去与该段原始代码所对应的抽象语法树,直接使用代码代替抽象语法树以示意性说明第一预设语法所进行的转换内容。

如下所示代码是经过第一预设语法转换后的代码:

async function SAEEmail(){

let title, body, to;

const item = dataPoint.getItem();

title = item.isUpdated()

`SAE Added!! ` :

`SAE Updated!!! `;

body = await generateBody(item);

switch (subject.environmentId) {

case '4028e43d5b7f3ff9015b7f422e100001':

to = "user_dev@mdsol.com";

break;

default:

to = "user_any@mdsol.com";

}

await context.sendEmailToAddress([to], title, body);

}

由以上经过第一预设语法转换后的代码可以看到,系统判断context.sendEmailToAddress([to], title, body)为异步函数,在该函数前增加await关键字;系统在代码中添加相应的包装函数体,包装函数体中的函数名可以为用户自定义的名字;系统判断出该函数增加了await,为该函数添加async关键字。

在步骤107中,系统根据转换后的抽象语法树输出相应的可执行的JavaScript脚本和第二自定义逻辑单元声明文件。JavaScript脚本用于执行用户通过原始代码所定义的逻辑。第二自定义逻辑单元声明文件中包含有原始代码所定义的逻辑单元。

在步骤108中,系统将第二自定义逻辑单元声明文件加入第一自定义逻辑单元声明文件。若TypeScript声明文件中未包括第一自定义逻辑单元声明文件,则新建第一自定义逻辑单元声明文件,然后将第二自定义逻辑单元声明文件加入第一自定义逻辑单元声明文件中。通过将由原始代码生成的第二自定义逻辑单元声明文件加入第一自定义逻辑单元声明文件,使得第一自定义逻辑单元声明文件中包含有用户通过原始代码定义的逻辑单元。也就是说,用户自定义的逻辑单元可以保存下来供下次直接使用,无需再次重新定义,简化了自定义逻辑的使用方式并提高了用户自定义逻辑的效率。

综上步骤101-108所述,本申请的使用领域专用语言的自定义逻辑方法通过使用DSL语言来实现用户自定义逻辑,能够让普通用户用较低的学习成本实现对复杂逻辑进行自定义。并且,当系统规模扩大到一定程度时,DSL语言仍能具有较高的使用效率,用户的使用成本不会随着系统规模的扩大而快速上升,非常适用于较大规模的系统。

在本申请的另一实施例中,一种使用领域专用语言的自定义逻辑方法运行于TypeScript编译器和TypeScript编辑器中,该方法还可以包括如图4和图5所示的以下步骤401-415:

步骤401,将TypeScript声明文件注册到TypeScript编辑器中;

步骤402,响应于用户的输入请求,加载编辑框;

步骤403,接收用户在编辑框中输入的原始代码和原始代码的函数类型;

步骤404,基于TypeScript编译器根据TypeScript声明文件验证原始代码;

步骤405,若验证不通过则输出错误信息并结束,若验证通过则继续;

步骤406,响应于用户的保存请求,将原始代码、原始代码的函数类型和TypeScript声明文件发送至TypeScript编译器;

步骤407,接收用户输入的原始代码和原始代码的函数类型,其中原始代码使用基于TypeScript语言的预设的领域专用语言,其中预设的领域专用语言的语法包括第一预设语法和第二预设语法,第一预设语法用于还原异步操作,第二预设语法用于判断函数类型;

步骤408,将TypeScript声明文件注册到TypeScript编译器中,其中TypeScript声明文件包含预设的领域专用语言的语法规则,TypeScript声明文件包括以下任意一个或多个:系统逻辑单元声明文件、工具逻辑单元声明文件和第一自定义逻辑单元声明文件;

步骤409,将原始代码转换成相应的抽象语法树;

步骤410,基于TypeScript编译器根据TypeScript声明文件验证原始代码,若验证不通过则输出错误信息并结束;

步骤411,根据第二预设语法验证抽象语法树的函数类型与用户输入的原始代码的函数类型是否一致,若不一致则输出错误信息并结束;

步骤412,根据第一预设语法对抽象语法树进行转换;

步骤413,根据转换后的抽象语法树输出相应的可执行的JavaScript脚本和第二自定义逻辑单元声明文件;以及

步骤414,将第二自定义逻辑单元声明文件加入第一自定义逻辑单元声明文件;以及

步骤415,根据预设翻译语法翻译转换后的抽象语法树,并输出翻译结果供用户查看。

上述步骤401-406运行于TypeScript编辑器中,其中TypeScript编辑器包括用于接收用户输入的编辑框。上述步骤407-415运行于JavaScript编译器中。步骤407中的“接收用户输入的原始代码和原始代码的函数类型”是由TypeScript编译器接收TypeScript编辑器所发送的用户输入的原始代码和原始代码的函数类型。步骤407-414可以参考前述图1实施例中对步骤101-108的说明,在此不再赘述。

下面对步骤401-406和415进行详细说明:

在步骤401中,自定义逻辑系统将TypeScript声明文件注册到TypeScript编辑器中。通过将TypeScript声明文件注册到TypeScript编辑器,使得TypeScript编辑器可以获取到TypeScript声明文件中的各类逻辑单元。

在步骤402中,响应于用户的输入请求,系统加载编辑框。用户可以在编辑框中进行输入。

在步骤403中,系统接收用户在编辑框中输入的原始代码和所述原始代码的函数类型。

在步骤404中,系统基于TypeScript编译器根据TypeScript声明文件验证原始代码。

在步骤405中,若验证通过,系统继续执行下一步骤;若验证不通过则输出错误信息并结束。具体验证方法可参考前述图1实施例中对步骤104的详细说明,在此不再赘述。

在步骤406中,响应于用户的保存请求,系统将原始代码、所述原始代码的函数类型和TypeScript声明文件发送至TypeScript编译器。通过将原始代码发送给TypeScript编译器,TypeScript编译器能够接收到用户输入的原始代码和原始代码的函数类型执行后续步骤407-415。通过将TypeScript声明文件与原始代码一同发送至TypeScript编译器,TypeScript编译器能够在接收原始代码的同时接收到与该原始代码相关的TypeScript声明文件。这样一来,当TypeScript编译器作为后端需要同时服务多个作为前端的TypeScript编辑器时,能够确定每段原始代码分别与哪些TypeScript声明文件相关。

在本申请的一实施例中,该方法还包括:当用户在编辑框中输入原始代码时,系统根据用户当前输入的内容在TypeScript声明文件中进行匹配。当TypeScript声明文件中有一个或多个逻辑单元的名字能够与用户当前输入的内容部分匹配时,则认为这些逻辑单元为当前匹配结果,并在编辑框中展现匹配结果以对用户进行逻辑单元提示,使得用户能够根据逻辑单元提示更准确、快捷地进行原始代码的输入。图6是根据本实施例示出的逻辑单元提示的界面示意图。如图6所示,用户在编辑框中输入了“da”两个字母,编辑器能根据“da”两个字母在TypeScript声明文件中进行匹配,并在下拉框中展现当前的匹配结果。

在本申请的一实施例中,TypeScript编辑器可以包含第一报错函数和第二报错函数。其中,第一报错函数可以为TypeScript编辑器自带的报错函数;第二报错函数可以为预设自定义报错函数,用于根据错误信息判断错误是否与第二预设语法相关。一种使用领域专用语言的自定义逻辑方法还可以包括如图7所示的以下步骤701-703:

步骤701,当出现错误信息时,系统调用第二报错函数根据错误信息判断错误是否与第二预设语法相关;

步骤702,若相关,则系统消除错误信息;以及

步骤703,若不相关,则系统调用第一报错函数,并将错误消息发送给第一报错函数。

在一个示例中,TypeScript编辑器可以为Monaco Editor编辑器,第一报错函数可以为Monaco Editor内部的setModelMarkers。第二报错函数可以为用户预先设置的自定义报错函数setModelMarkers’,第二报错函数setModelMarkers’能够根据错误信息判断错误是否与第二预设语法相关,即错误是否符合第二预设语法的规则。通常情况下,编辑器自带的报错函数只能判断出不符合通用编程语言的语法的错误,而不能判断出不符合通用编程语言语法但符合DSL语言语法的错误。当出现错误信息时,系统通过调用第二报错函数setModelMarkers’来判断错误是否与第二预设语法相关。若与第二预设语法相关,则该错误符合DSL语言的语法,系统消除该错误信息;若不相关,则系统调用第一报错函数,并将错误消息发送给第一报错函数,将错误参数传给第一报错函数。通过使用第二报错函数判断出不符合通用编程语言语法但符合DSL语言语法的错误信息,能够避免出现符合DSL语言语法的错误导致的错误信息,从而实现使用DSL语言时也能准确报错。

在本申请的一实施例中,错误信息可以包括错误提示消息和错误位置信息,其中错误提示消息用于在编辑框中提示用户出现错误,错误位置信息用于在编辑框中提示用户错误所在的位置。在一个示例中,系统可以根据错误提示信息和错误位置信息在编辑框中以红色下划波浪线的形式标示出错误来对用户进行错误提示。

在本申请的一实施例中,在步骤408的“将TypeScript声明文件注册到TypeScript编译器中”之前,一种使用领域专用语言的自定义逻辑方法还可以包括:系统接收TypeScript编辑器发送的TypeScript声明文件。通过接收TypeScript编辑器发送的TypeScript声明文件,系统可以知道该TypeScript编辑器所使用的TypeScript声明文件。这样一来,当系统具有多个不同的相互独立的TypeScript编辑器时,能够确定每个TypeScript编辑器分别与哪些TypeScript声明文件相关。

在步骤415中,预设的领域专用语言的语法还包括预设翻译语法,系统根据预设翻译语法翻译转换后的抽象语法树,并输出翻译结果供用户查看。通过将与原始代码相对应的转换后的抽象语法树进行翻译,输出易于阅读和理解的翻译结果,使得不能够直接理解原始代码的用户可以通过翻译结果了解到原始代码所定义的逻辑。在一个示例中,预设翻译语法可以包括以下五类翻译规则:

1、翻译IF:if{条件}then{分支一}else{分支二}翻译为如果{条件}那么{分支一}否则{分支二};

2、翻译BinaryExpression:>翻译为大于,=翻译为等于,<翻译为小于,+翻译为加,-翻译为减,*翻译为乘,/翻译为除,|翻译为或者,&翻译为并且;

3、翻译UnaryExpression:!翻译为不是;

4、翻译CallExpression:call的形式为call(param1,param2),翻译为调用“自定义函数call,参数为param1,param2”;

5、翻译isReturnStatement:return的形式为return ret,翻译为返回ret的结果或判断;

本申请还提供了一种使用领域专用语言的自定义逻辑系统,包括:存储器,用于存储可由处理器执行的指令;以及处理器,用于执行所述指令以实现如上所述的使用领域专用语言的自定义逻辑方法。

图8示出了根据本申请一实施例示出的使用领域专用语言的自定义逻辑系统的系统框图。使用领域专用语言的自定义逻辑系统800可包括内部通信总线801、处理器(Processor)802、只读存储器(ROM)803、随机存取存储器(RAM)804、以及通信端口805。当应用在个人计算机上时,使用领域专用语言的自定义逻辑系统还可以包括硬盘807。内部通信总线801可以实现使用领域专用语言的自定义逻辑系统800组件间的数据通信。处理器802可以进行判断和发出提示。在一些实施例中,处理器802可以由一个或多个处理器组成。通信端口805可以实现使用领域专用语言的自定义逻辑系统800与外部的数据通信。在一些实施例中,使用领域专用语言的自定义逻辑系统800可以通过通信端口805从网络发送和接受信息及数据。使用领域专用语言的自定义逻辑系统800还可以包括不同形式的程序储存单元以及数据储存单元,例如硬盘807,只读存储器(ROM)803和随机存取存储器(RAM)804,能够存储计算机处理和/或通信使用的各种数据文件,以及处理器802所执行的可能的程序指令。处理器执行这些指令以实现方法的主要部分。处理器处理的结果通过通信端口传给用户设备,在用户界面上显示。

上述的使用领域专用语言的自定义逻辑方法可以实施为计算机程序,保存在硬盘807中,并可记载到处理器802中执行,以实施本申请中的任一种使用领域专用语言的自定义逻辑方法。

本申请还提供了一种存储有计算机程序代码的计算机可读介质,所述计算机程序代码在由处理器执行时实现如上所述的使用领域专用语言的自定义逻辑方法。

使用领域专用语言的自定义逻辑方法实施为计算机程序时,也可以存储在计算机可读存储介质中作为制品。例如,计算机可读存储介质可以包括但不限于磁存储设备(例如,硬盘、软盘、磁条)、光盘(例如,压缩盘(CD)、数字多功能盘(DVD))、智能卡和闪存设备(例如,电可擦除可编程只读存储器(EPROM)、卡、棒、键驱动)。此外,本文描述的各种存储介质能代表用于存储信息的一个或多个设备和/或其它机器可读介质。术语“机器可读介质”可以包括但不限于能存储、包含和/或承载代码和/或指令和/或数据的无线信道和各种其它介质(和/或存储介质)。

应该理解,上文所描述的实施例仅是示意。本文描述的实施例可在硬件、软件、固件、中间件、微码或者其任意组合中实现。对于硬件实现,处理单元可以在一个或者多个特定用途集成电路(ASIC)、数字信号处理器(DSP)、数字信号处理设备(DSPD)、可编程逻辑器件(PLD)、现场可编程门阵列(FPGA)、处理器、控制器、微控制器、微处理器和/或设计为执行本文所述功能的其它电子单元或者其结合内实现。

上文已对基本概念做了描述,显然,对于本领域技术人员来说,上述申请披露仅仅作为示例,而并不构成对本申请的限定。虽然此处并没有明确说明,本领域技术人员可能会对本申请进行各种修改、改进和修正。该类修改、改进和修正在本申请中被建议,所以该类修改、改进、修正仍属于本申请示例性实施例的精神和范围。

同时,本申请使用了特定词语来描述本申请的实施例。如“一个实施例”、“一实施例”、和/或“一些实施例”意指与本申请至少一个实施例相关的某一特征、结构或特点。因此,应强调并注意的是,本说明书中在不同位置两次或多次提及的“一实施例”或“一个实施例”或“一替代性实施例”并不一定是指同一实施例。此外,本申请的一个或多个实施例中的某些特征、结构或特点可以进行适当的组合。

本申请的一些方面可以完全由硬件执行、可以完全由软件(包括固件、常驻软件、微码等)执行、也可以由硬件和软件组合执行。以上硬件或软件均可被称为“数据块”、“模块”、“引擎”、“单元”、“组件”或“系统”。处理器可以是一个或多个专用集成电路(ASIC)、数字信号处理器(DSP)、数字信号处理器件(DAPD)、可编程逻辑器件(PLD)、现场可编程门阵列(FPGA)、处理器、控制器、微控制器、微处理器或者其组合。此外,本申请的各方面可能表现为位于一个或多个计算机可读介质中的计算机产品,该产品包括计算机可读程序编码。例如,计算机可读介质可包括,但不限于,磁性存储设备(例如,硬盘、软盘、磁带……)、光盘(例如,压缩盘CD、数字多功能盘DVD……)、智能卡以及闪存设备(例如,卡、棒、键驱动器……)。

同理,应当注意的是,为了简化本申请披露的表述,从而帮助对一个或多个申请实施例的理解,前文对本申请实施例的描述中,有时会将多种特征归并至一个实施例、附图或对其的描述中。但是,这种披露方法并不意味着本申请对象所需要的特征比权利要求中提及的特征多。实际上,实施例的特征要少于上述披露的单个实施例的全部特征。

虽然本申请已参照当前的具体实施例来描述,但是本技术领域中的普通技术人员应当认识到,以上的实施例仅是用来说明本申请,在没有脱离本申请精神的情况下还可作出各种等效的变化或替换,因此,只要在本申请的实质精神范围内对上述实施例的变化、变型都将落在本申请的权利要求书的范围内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号