发明内容
发明人发现,相关技术的业务功能开发难度比较大,涉及到的人员比较多,而且需要专业的程序开发和测试人员,业务功能开发周期也比较长。
本公开对于用户基于配置的语法规则编写的业务逻辑的脚本,能够自动解析并且生成相应的语法树以及表达式,根据业务逻辑组合各个表达式形成可执行的表达式对象,最终实现业务逻辑相应的业务功能,降低业务功能实现难度,缩短开发周期。并且,语法规则可配置为接近自然语言的高级语言,支持中文,熟悉语法规则的普通业务人员可以根据业务需求自行编写脚本,不再需要专业的程序开发和测试人员。
本公开的一些实施例提出一种实现业务功能的方法,包括:
获取基于配置的语法规则编写的业务逻辑的脚本;
对所述脚本进行词法解析和语法解析,以生成相应的语法树;
遍历所述语法树,基于所述语法规则,针对所述语法树的每个节点生成相应的表达式;
根据所述业务逻辑组合各个表达式形成可执行的表达式对象,以实现所述业务逻辑相应的业务功能。
在一些实施例中,所述语法规则是可配置的,所述语法规则包括变量类型、运算符、内置函数、自定义函数、功能模板。
在一些实施例中,还包括:提供编写业务逻辑的脚本的可视化环境,以使得用户在可视化环境中通过拖拽方式编写业务逻辑的脚本,所述可视化环境包括可拖拽的资源。
在一些实施例中,所述可拖拽的资源包括变量库、函数库、功能模板库中的一项或多项。
在一些实施例中,对所述脚本进行词法解析和语法解析包括:
通过词法解析器将所述脚本的字符流转换成单词序列;
通过语法解析器分析所述单词序列以确定其语法结构;
根据所述语法结构生成所述脚本相应的语法树。
在一些实施例中,在生成表达式之前还包括:对所述语法树中每个节点涉及的变量和参数类型进行校验,如果校验通过,再生成所述部分相应的表达式。
在一些实施例中,还包括:测试所述表达式对象,以验证所述业务逻辑相应的业务功能。
本公开的一些实施例提出一种实现业务功能的脚本引擎,包括:
语法规则单元,用于配置语法规则;
脚本单元,用于提供编写业务逻辑的脚本的可视化环境;
解析单元,用于对编写的脚本进行词法解析和语法解析,以生成相应的语法树;
表达式单元,用于遍历所述语法树,基于所述语法规则,针对所述语法树中各个节点生成相应的表达式;
功能单元,用于根据所述业务逻辑组合各个表达式形成可执行的表达式对象,以实现所述业务逻辑相应的业务功能。
本公开的一些实施例提出一种实现业务功能的脚本引擎,包括:存储器;以及耦接至所述存储器的处理器,所述处理器被配置为基于存储在所述存储器中的指令,执行任一些实施例所述的实现业务功能的方法。
本公开的一些实施例提出一种非瞬时性计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现任一些实施例所述的实现业务功能的方法的步骤。
具体实施方式
下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述。
图1为本公开实现业务功能的脚本引擎(简称“脚本引擎”)的一些实施例的示意图。
如图1所示,脚本引擎10包括:语法规则单元11、脚本单元12、解析单元13、表达式单元14和功能单元15。其中,语法规则单元11,用于配置和记录语法规则。脚本单元12,用于提供编写业务逻辑的脚本的可视化环境。解析单元13,用于对编写的脚本进行词法解析和语法解析,以生成相应的语法树。解析单元13包括词法解析器131和语法解析器132。解析器例如可以基于ANTLR(Another Tool for Language Recognition,另一种语言识别工具)实现,ANTLR是解析器的生成器,根据输入自动生成语法树并可视化的显示出来的开源语法分析器。表达式单元14,用于遍历语法树,基于语法规则,针对语法树中各个节点生成相应的表达式。功能单元15,用于根据业务逻辑组合各个表达式形成表达式对象,以实现业务逻辑相应的业务功能。下面结合业务功能实现过程描述各个单元的详细功能。
图2为本公开实现业务功能的方法的一些实施例的示意图。
如图2所示,该实施例的方法包括:步骤21-25,可选的,还可以包括步骤26。
在步骤21,用户配置自己的语法规则,脚本引擎10(语法规则单元11)记录配置的语法规则。
语法规则是可配置的,不同的用户可以配置不同的语法规则。语法规则包括变量类型、运算符、内置函数、自定义函数和功能模板等内容以及这些内容的表示方式(如中文、英文、符号等)。变量类型包括数值型、字符型、布尔型(Boolean,包括真或假两种数值),日期型,还包括数组变量,包括定长和不定长数组等。运算符主要包括基本算术运算符(如+,-,*,/等)、逻辑运算符(如AND,OR,NOT等)和比较运算符(如>,<,=等)。函数主要包括字符类函数(如SUBSTRING、TRIM等)、日期类函数(如DATE、SYSTEMDATE等)、数学函数(如RANDOM、LOG等)、统计类函数、数组类函数(如MAX、SUM等)、转换类函数(如TOSTRING、TONUMBER等)等。模板主要包括循环模板(WHILE)和条件模板(IF)。
下面以条件模板(或称“条件表达式”)为例说明语法规则。条件表达式(也即IF表达式)由IF(也可以定义成中文“如果”)关键字,条件表达式,THEN(也可以定义成中文“那么”)关键字,逻辑代码块,ENDIF(也可以定义成中文“结束如果”)关键字组成。其中,条件表达式支持AND,OR,NOT等逻辑表达式,逻辑表达式中可支持+,-,*,/等算术表达式,算术表达式中可以填入变量,变量支持字母,数字,中文和下划线的任意组合。逻辑代码块可以是赋值语句、返回(RETURN)语句、IF或者WHILE等定义的表达式,可以进行层层嵌套使用。
在步骤22,用户基于配置的语法规则编写业务逻辑的脚本,脚本引擎10(脚本单元12)获取用户编写的脚本。
脚本引擎10提供编写业务逻辑的脚本的可视化环境,可视化环境包括可拖拽的资源,可拖拽的资源例如包括变量库、内置函数库、功能模板库等,使得用户在可视化环境中通过拖拽方式编写业务逻辑的脚本。
图3示出一种示例性的编写脚本的可视化环境,右侧是可拖拽的资源,例如变量库,包括用户.姓名,用户.年龄,用户.性别,用户.工作年限等用户相关的变量,左侧是脚本的编写工作区,用户编写脚本时,如果用到右侧的资源,则将右侧的资源拖拽到左侧的编写工作区,例如,将右侧的“用户.工作年限”变量拖拽到左侧的编写工作区,还可以通过快捷键“Alt+?”进行变量的提示,不需要用户逐字逐句地写入该变量,这样不容易出错。可视化环境的上面还可以设置各种功能按钮,如,导出、单元测试、批量测试、保存、更新版本、全屏等。
例如,一个关于程序员资历评定的业务功能,其业务逻辑是:如果用户的工作年限大于3并且用户的专业是软件工作,那么就可以给用户设置一个资深程序员的标签。参见图3左侧部分的编写工作区,针对该业务逻辑编写的脚本如下:
1:IF‘用户.工作年限’>3.0AND‘用户.专业’=“软件工程”
2:THEN‘用户.标签’=“资深程序员”
3:ENDIF
在步骤23,脚本引擎10(解析单元13)对脚本进行词法解析和语法解析,以生成相应的语法树。
其中,对脚本进行词法解析和语法解析包括:通过词法解析器将脚本的字符流转换成单词序列;通过语法解析器分析单词序列以确定其语法结构;根据语法结构生成脚本相应的语法树。
词法解析器(Lexer)的工作是分析量化那些本来毫无意义的字符流,将他们翻译转换成离散的单词序列(每个单词也就是一个个Token),这些单词包括关键字,标识符,符号(symbols)和操作符等,供语法解析器使用。词法解析过程中,如果出现词法错误,会提示词法错误。例如,针对如下脚本,假设配置的词法规则未定义“&”,当脚本中出现“&”时,词法解析器会提示“【词法错误】未定义词法:&”。
1:IF‘用户.工作年限’>3.0&&‘用户.专业’=“软件工程”
2:THEN‘用户.标签’=“资深程序员”
3:ENDIF
语法解析器(Parse)相对于词法解析器(Lexer)来说,关注所生成的单词的语法意义及其与上下文之间的关系,将各个单词组织起来,并转换成为目标语言语法规则所允许的序列。例如,针对如下脚本,假设配置的语法规则规定变量由单引号引起来的,如果用户输入的变量是双引号引起来的,不符合配置的语法规则,就会报语法错误,提示“【语法错误】不合法的输入变量“用户.标签””。
1:IF‘用户.工作年限’>3.0&&‘用户.专业’=“软件工程”
2:THEN“用户.标签”=“资深程序员”
3:ENDIF
脚本经过词法解析和语法解析被生成相应的语法树。图4示出一种示例性的语法树,是“程序员资历评定”脚本对应的语法树,其第一层次包括依次出现的关键词(如IF、AND、THEN、ENDIF),第二层次包括条件表达式以及逻辑代码等,如用户.工作年限、用户.专业、用户.标签等部分涉及到的脚本逻辑。
在步骤24,脚本引擎10(表达式单元14)遍历语法树,基于语法规则,针对语法树中各个节点生成相应的表达式。
以图4所示的语法树为例,中序遍历这棵语法树,最左下方的部分,第一个节点是“用户.工作年限”,通过定义的规则我们会识别出它是一个变量,第二个节点是“>”,通过定义的规则我们会识别它是一个比较操作符,第三个节点是“3”,通过定义的规则我们会识别出它是一个数字常量,确认这三个节点的具体类型后,识别出语法树的这些节点是一个比较逻辑,因此生成一个比较表达式(设为比较表达式1,ComExpression1)。比较表达式由左表达式、比较符和右表达式组成。比较表达式1是由变量表达式(Variable)、比较符、常量表达式(Constant)组成。
在生成表达式之前,还对语法树中每个部分涉及的变量和参数类型进行校验,如果校验通过,再生成部分相应的表达式。例如,在生成表达式之前,验证变量“用户.工作年限”是否存在,由于比较表达式左/右表达式的类型必须一致,因此还需要进行参数类型匹配性的校验,如果验证不通过,可以提示相应的错误信息,使得用户改正,如果验证通过,就会生成对应的表达式。
接着,参考比较表达式1的生成过程,继续中序遍历语法树的其他节点,还会依次生成比较表达式2(ComExpression2,对应用户.专业’=“软件工程”部分),和表达式(AndExpression,对应AND部分),那么表达式(ThenExpression)及其赋值表达式(AssignExpression,对应设置用户标签部分),以及如果表达式(IFExpression)。图5示出最终的表达式结构示意图,包括各个表达式以及它们的逻辑关系。
其中,每种类别的表达式都会实现表达式接口IExpression,该接口实现了一个用来执行表达式逻辑的方法IValue execute(Map<String,IValue>context),Map<String,IValue>表示变量的名字及其值。以比较表达式为例,首先会执行比较表达式左边的变量表达式,变量表达式执行execute方法会从上下文context中获取变量的值,比较表达式右边的常量表达式执行会生成对应的一个常量值,整个比较表达式执行execute方法会将左/右表达式执行的结果根据比较符进行比较,最后返回比较的结果。
在步骤25,脚本引擎10(功能单元15)根据业务逻辑组合各个节点表达式形成可执行的表达式对象,以实现业务逻辑相应的业务功能。业务功能可以是平台内置的,或者用户自定义的。
组合各个表达式形成可执行表达式对象包括:根据定义的语法规则和业务逻辑(该业务逻辑可通过脚本或语法树体现,语法树中各个节点的逻辑关系对应各个表达式的逻辑关系),组合各个表达式形成可直接执行的表达式对象(可以是二进制文件),以实现业务逻辑相应的业务功能。
在步骤26,脚本引擎10测试表达式对象,以验证业务逻辑相应的业务功能。测试通过的表达式对象,还可以导出,任何应用引入该表达式对象就可以执行该表达式对象,实现业务逻辑相应的业务功能。使用简单、方便、可扩展性强、执行效率高。
测试数据1:
序号 |
字段名 |
字段值 |
1 |
用户.专业 |
软件工程 |
2 |
用户.工作年限 |
3 |
测试数据1的测试结果1:
序号 |
字段名 |
字段值 |
1 |
用户.专业 |
软件工程 |
2 |
用户.工作年限 |
3 |
3 |
用户.标签 |
资深程序员 |
测试数据2:
序号 |
字段名 |
字段值 |
1 |
用户.专业 |
软件工程 |
2 |
用户.工作年限 |
1 |
测试数据2的测试结果2:
测试表明:表达式对象实现了预定的业务逻辑:如果用户的工作年限大于3并且用户的专业是软件工作,那么就可以给用户设置一个资深程序员的标签。
上述实施例,对于用户基于配置的语法规则编写的业务逻辑的脚本,能够自动解析并生成相应的语法树以及表达式,根据业务逻辑组合各个表达式形成可执行的表达式对象,最终实现业务逻辑相应的业务功能,降低业务功能实现难度,缩短开发周期,降低了发布风险。并且,语法规则可配置为接近自然语言的高级语言,如领域特定语言(domain-specific language,DSL),可支持中文,熟悉语法规则的普通业务人员(非专业程序人员)可以根据业务需求自行编写脚本,不再需要专业的程序开发和测试人员,完全解放开发和测试人员,节省了人力成本。此外,脚本语言采用预编译模式,将脚本编译后的表达式对象保存,执行时直接执行编译后的表达式对象,非常高性能。并且编译后的表达式对象可导出,通过引入导出的软件包可以在任何项目中执行,扩展性极好。
本公开的实现业务功能的方案可以应用于风险决策等业务场景中的业务逻辑以及业务功能的实现。
图6为本公开实现业务功能的脚本引擎(简称“脚本引擎”)的另一些实施例的示意图。
如图6所示,该实施例的脚本引擎60包括:存储器61以及耦接至该存储器61的处理器62,处理器62被配置为基于存储在存储器61中的指令,执行前述任意一些实施例中的实现业务功能的脚本方法。
其中,存储器61例如可以包括系统存储器、固定非易失性存储介质等。系统存储器例如存储有操作系统、应用程序、引导装载程序(Boot Loader)以及其他程序等。
脚本引擎60还可以包括输入输出接口63、网络接口64、存储接口65等。这些接口63,64,65以及存储器61和处理器62之间例如可以通过总线66连接。其中,输入输出接口63为显示器、鼠标、键盘、触摸屏等输入输出设备提供连接接口。网络接口64为各种联网设备提供连接接口。存储接口65为SD卡、U盘等外置存储设备提供连接接口。
本领域内的技术人员应当明白,本公开的实施例可提供为方法、系统、或计算机程序产品。因此,本公开可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本公开可采用在一个或多个其中包含有计算机可用程序代码的计算机可用非瞬时性存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本公开是参照根据本公开实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解为可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上所述仅为本公开的较佳实施例,并不用以限制本公开,凡在本公开的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本公开的保护范围之内。