首页> 中国专利> 表达式的解析处理系统和解析处理方法

表达式的解析处理系统和解析处理方法

摘要

本发明提供了一种表达式的解析处理系统,包括:生成单元,用于生成表达式语句;转换单元,用于对所述表达式语句进行转换,使之符合预设语言规则;编译单元,用于对符合所述预设语言规则的表达式语句进行编译,以创建所述表达式语句的表达式组件,并将所述表达式组件生成为二进制流;存储单元,用于将所述二进制流存储至数据库中,以供使用。相应地,本发明还提出了一种表达式的解析处理方法。通过本发明的技术方案,可以有效解决构造动态解析引擎复杂度高的问题,还可以提供面向业务的易用性,并且支持复杂的业务场景的要求。

著录项

  • 公开/公告号CN102779044A

    专利类型发明专利

  • 公开/公告日2012-11-14

    原文格式PDF

  • 申请/专利权人 用友软件股份有限公司;

    申请/专利号CN201210223624.0

  • 发明设计人 商平锋;

    申请日2012-06-28

  • 分类号G06F9/44(20060101);

  • 代理机构北京友联知识产权代理事务所(普通合伙);

  • 代理人尚志峰;汪海屏

  • 地址 100094 北京市海淀区北清路68号用友软件园

  • 入库时间 2023-12-18 07:16:49

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2016-03-02

    专利权的转移 IPC(主分类):G06F9/44 登记生效日:20160215 变更前: 变更后: 申请日:20120628

    专利申请权、专利权的转移

  • 2016-01-20

    授权

    授权

  • 2013-01-09

    实质审查的生效 IPC(主分类):G06F9/44 申请日:20120628

    实质审查的生效

  • 2012-11-14

    公开

    公开

说明书

技术领域

本发明涉及计算机技术领域,具体而言,涉及一种表达式的解析处理 系统和解析处理方法。

背景技术

从业务应用角度,在处理业务对象过程中,经常遇到如下问题:

1)通过过滤条件,筛选出符合业务规则的结果集合。

2)某个业务对象的属性可能由其他属性决定或其他多个属性通过运 算获取。

基于以上两个方面的应用,需要定义出一种值表达式设计或运行的业 务模型,满足上述两方面的要求。

从技术角度,在描述业务对象属性时,有时该属性是有由他属性决定 的,即由其他属性通过计算获得,计算的过程需要提前定义,该定义就是 对表达式的描述。业务对象有多种表现形式,如表单,报表以及其过滤条 件等等。在现有技术中,通常有如下两种解决方案:

1.对于解释型表达式框架,通过构造一个动态解析引擎,对表达式 字符串动态解析处理,识别其中函数(系统函数和自定义函数)、参数、 逻辑运算符以及运算的优先级,在运行时动态的调用相应的函数和参数转 换。

2.基于Lamda表达式引擎,通过构造Lamda表达式树,编译后,传 参调用,获取结果值。

方案1的问题在于表达式处理复杂度高。方案2的问题在于支持不够 全面,目前只支持C#表达式,例如要生成Sql表达式则需要重新构造一 套处理引擎,这是Lamda表达式局限性的一个方面,另一个方面则在于 灵活性和扩展性无法满足复杂场景的业务要求。

因此,需要一种新的表达式的解析处理技术,可以有效解决构造动态 解析引擎复杂度高的问题,还可以提供面向业务的易用性,并且支持复杂 的业务场景的要求。

发明内容

本发明正是基于上述问题,提出了一种新的表达式的解析处理技术, 可以有效解决构造动态解析引擎复杂度高的问题,还可以提供面向业务的 易用性,并且支持复杂的业务场景的要求。

有鉴于此,本发明提出了一种表达式的解析处理系统,包括:生成单 元,用于生成表达式语句;转换单元,用于对所述表达式语句进行转换, 使之符合预设语言规则;编译单元,用于对符合所述预设语言规则的表达 式语句进行编译,以创建所述表达式语句的表达式组件,并将所述表达式 组件生成为二进制流;存储单元,用于将所述二进制流存储至数据库中, 以供使用。在该技术方案中,通过表达式语句的转换,降低了编译难度和 复杂程度,且具有更高的扩展性。

在上述技术方案中,优选地,还包括:规则设置单元,用于设置自定 义元素的转换规则;所述转换单元还用于:获取所述表达式语句中的自定 义元素,并根据所述自定义元素的种类,对所述自定义元素进行相应的转 换,以将所述表达式语句转换为符合所述预设语言规则的表达式语句。

在上述技术方案中,优选地,所述转换单元进行转换的自定义元素包 括自定义函数和/或自定义参数。

在上述技术方案中,优选地,还包括:加载单元,用于从数据库中获 取所述二进制流,将所述二进制流反射为对应的表达式组件对象,并将所 述表达式组件对象加载至缓存中;执行单元,用于调用所述表达式组件对 象的执行接口,输入业务参数,以执行所述表达式组件对象,并返回执行 结果。

在上述技术方案中,优选地,还包括:标识缓存单元,用于在加载所 述表达式组件对象时,缓存所述表达式组件对象的第一时间戳和/或第一 标识;判断单元,用于在所述执行单元进行操作之前,获取所述表达式组 件对象的第二时间戳和/或第二标识,并判断所述第一时间戳与所述第二 时间戳、和/或所述第一标识与所述第二标识是否发生变化,若是,则清 除缓存,并由所述加载单元重新加载所述表达式组件对象。

根据本发明的又一方面,还提出了一种表达式的解析处理方法,包 括:步骤202,生成表达式语句,并对所述表达式语句进行转换,使之符 合预设语言规则;步骤204,对符合所述预设语言规则的表达式语句进行 编译,以创建所述表达式语句的表达式组件,并将所述表达式组件生成为 二进制流;步骤206,将所述二进制流存储至数据库中,以供使用。在该 技术方案中,通过表达式语句的转换,降低了编译难度和复杂程度,且具 有更高的扩展性。

在上述技术方案中,优选地,所述步骤202之前,还包括:设置自定 义元素的转换规则;获取所述表达式语句中的自定义元素,并根据所述自 定义元素的种类,对所述自定义元素进行相应的转换,以将所述表达式语 句转换为符合所述预设语言规则的表达式语句。

在上述技术方案中,优选地,所述自定义元素包括自定义函数和/或 自定义参数。

在上述技术方案中,优选地,所述步骤206之后,还包括:步骤 208,从数据库中获取所述二进制流,将所述二进制流反射为对应的表达 式组件对象,并将所述表达式组件对象加载至缓存中;步骤210,调用所 述表达式组件对象的执行接口,输入业务参数,以执行所述表达式组件对 象,并返回执行结果。

在上述技术方案中,优选地,所述步骤208还包括:缓存所述表达式 组件对象的第一时间戳和/或第一标识;所述步骤210之前还包括:获取 所述表达式组件对象的第二时间戳和/或第二标识,并判断所述第一时间 戳与所述第二时间戳、和/或所述第一标识与所述第二标识是否发生变 化,若是,则清除缓存,并返回所述步骤208以重新加载所述表达式组件 对象。

通过以上技术方案,可以有效解决构造动态解析引擎复杂度高的问 题,还可以提供面向业务的易用性,并且支持复杂的业务场景的要求。

附图说明

图1示出了根据本发明的一个实施例的表达式的解析处理系统的框 图;

图2示出了根据本发明的一个实施例的表达式的解析处理方法的流程 图;

图3示出了根据本发明的一个实施例的表达式编辑器的框图;

图4示出了根据本发明的另一个实施例的表达式的解析处理方法的流 程图;

图5是图4所示的实施例的表达式解析处理的模块执行示意图。

具体实施方式

为了能够更清楚地理解本发明的上述目的、特征和优点,下面结合附 图和具体实施方式对本发明进行进一步的详细描述。需要说明的是,在不 冲突的情况下,本申请的实施例及实施例中的特征可以相互组合。

在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是, 本发明还可以采用其他不同于在此描述的其他方式来实施,因此,本发明 的保护范围并不受下面公开的具体实施例的限制。

图1示出了根据本发明的一个实施例的表达式的解析处理系统的框 图。

如图1所示,根据本发明的一个实施例的表达式的解析处理系统 100,包括:生成单元102,用于生成表达式语句;转换单元104,用于对 表达式语句进行转换,使之符合预设语言规则;编译单元106,用于对符 合预设语言规则的表达式语句进行编译,以创建表达式语句的表达式组 件,并将表达式组件生成为二进制流;存储单元108,用于将二进制流存 储至数据库中,以供使用。在该技术方案中,通过表达式语句的转换,降 低了编译难度和复杂程度,且具有更高的扩展性。

在上述技术方案中,优选地,还包括:规则设置单元110,用于设置 自定义元素的转换规则;转换单元104还用于:获取表达式语句中的自定 义元素,并根据自定义元素的种类,对自定义元素进行相应的转换,以将 表达式语句转换为符合预设语言规则的表达式语句。

在上述技术方案中,优选地,转换单元104进行转换的自定义元素包 括自定义函数和/或自定义参数。

在上述技术方案中,优选地,还包括:加载单元112,用于从数据库 中获取二进制流,将二进制流反射为对应的表达式组件对象,并将表达式 组件对象加载至缓存中;执行单元114,用于调用表达式组件对象的执行 接口,输入业务参数,以执行表达式组件对象,并返回执行结果。

在上述技术方案中,优选地,还包括:标识缓存单元116,用于在加 载表达式组件对象时,缓存表达式组件对象的第一时间戳和/或第一标 识;判断单元118,用于在执行单元进行操作之前,获取表达式组件对象 的第二时间戳和/或第二标识,并判断第一时间戳与第二时间戳、和/或第 一标识与第二标识是否发生变化,若是,则清除缓存,并由加载单元112 重新加载表达式组件对象。

图2示出了根据本发明的一个实施例的表达式的解析处理方法的流程 图。

如图2所示,根据本发明的一个实施例的表达式的解析处理方法,包 括:步骤202,生成表达式语句,并对表达式语句进行转换,使之符合预 设语言规则;步骤204,对符合预设语言规则的表达式语句进行编译,以 创建表达式语句的表达式组件,并将表达式组件生成为二进制流;步骤 206,将二进制流存储至数据库中,以供使用。在该技术方案中,通过表 达式语句的转换,降低了编译难度和复杂程度,且具有更高的扩展性。

在上述技术方案中,优选地,步骤202之前,还包括:设置自定义元 素的转换规则;获取表达式语句中的自定义元素,并根据自定义元素的种 类,对自定义元素进行相应的转换,以将表达式语句转换为符合预设语言 规则的表达式语句。

在上述技术方案中,优选地,自定义元素包括自定义函数和/或自定 义参数。

在上述技术方案中,优选地,步骤206之后,还包括:步骤208,从 数据库中获取二进制流,将二进制流反射为对应的表达式组件对象,并将 表达式组件对象加载至缓存中;步骤210,调用表达式组件对象的执行接 口,输入业务参数,以执行表达式组件对象,并返回执行结果。

在上述技术方案中,优选地,步骤208还包括:缓存表达式组件对象 的第一时间戳和/或第一标识;步骤210之前还包括:获取表达式组件对 象的第二时间戳和/或第二标识,并判断第一时间戳与第二时间戳、和/或 第一标识与第二标识是否发生变化,若是,则清除缓存,并返回步骤208 以重新加载表达式组件对象。

图3示出了根据本发明的一个实施例的表达式编辑器的框图。

如图3所示,根据本发明的一个实施例的表达式编辑器,包括:

规则定义模块,设置对自定义元素进行处理的规则。

编译模块,通过转换模块获取符合C#语法的表达式语句,然后通 过.NET的CodeDom技术动态编译成可调用的组件,并以二进制的形式存 储在数据库中。

规则处理模块在所述自定义元素为自定义函数时,按照所述规则,将 所述自定义函数处理对应的.NET类的函数作为所述处理结果,或取得所 述自定义函数的调用结果作为所述处理结果。

转换模块,对表达式进行转换并符合C#语法结构的表达式语句(字 符串)。通过规则信息,将用户所见的字符串转变为后台实际自定义元素 自符串。如果自定义元素为自定义函数时,将其转换为“类名.函数名”的 形式;如果是自定义参数时,通过将其转换数组对象中的一个为当前表达 式中的输入项,例如args[2],同时为了使函数具有强类型的特征,并根据 当前参数的类型,在实际的表达式中为TypeConvertor.Convert<T>(args[2]) 的形式,其中T可以是string、int、char、DateTime以及Dictionary等 等。

执行模块,通过基于二进制流动态的加载和卸载可调用表达式组件, 从而实现组件的热插拔,从而满足了系统设计时和运行时并行工作的业务 场景。

加载器,通过二进制流加载并实例化表达式组件。

组件缓存器,缓存组件、组件标示和时间戳,动态监测组件的变化。

组件的卸载器,按需卸载已加载入内存中的组件。

图4示出了根据本发明的另一个实施例的表达式的解析处理方法的流 程图。

如图4所示,根据本发明的另一个实施例的表达式的解析处理方法, 包括:

步骤402,设置对自定义元素进行处理的规则;

步骤404,对用户设计的表达式进行转换处理,最终输入出为符合C# 语法结构的表达式语句;

步骤406,对表达式语句进行编译,取得可调用组件二进制流;

步骤408,通过二进制流动态的加载和卸载可调用表达式组件,获取 表达式的执行体对象。

下面结合图4所示的表达式的解析处理方法和图5所示的表达式解析 处理的模块,对本发明的技术方案进行详细说明:

整个过程可以分为表达式设计阶段、转换阶段、编译阶段和执行阶 段。

1、表达式设计过程,用户通过双击或拖拽界面上的函数节点或参数 节点,将函数或参数显示在编辑器鼠标所在的位置。用户看到的信息都是 与业务相关的信息,简单易懂,例如获取当前日期的年度值,例子$< 年>($<当前日期>),符合用户的使用习惯,并易于理解,用户无需理解计 算机语言。

2、转换阶段,转换器502,设计的表达式($<年>($<当前日期>))进行 转换处理,转换成符合C#语法结构的表达式语句,首先我们需要对其中函 数和参数进行识别并进行替换,至于语法是否符合C#规范,完全由编译 模块处理。识别过程不同于常规的解析引擎对函数和参数的识别,只需要 识别出函数“$<年>”替换成常规的函数$<DateFunction.Year>即可,并将 参数$<当前日期>替换成$<currentDate>。在转换器中,对表达式实际进行 了两次处理,上述中是转换的第一步,该步骤做要的工作将表达式中对应 的函数显示名称转换为实际的函数名,参数显示名转换为参数的编码。该 表达式持久化到数据库中,在用户多语显示时会有不同的显示。第二步转 换实际上是为编译阶段准备的,该步骤会将第一步转化的表达式转换为符 合C#语法结构的表达式语句,主要做如下工作:

■$<DateFunction.Year>会转换为DateFunction.Year。其中 DateFunction代表类对象,Year代表DateFunction的公共静态函 数。

■$<currentDate>会转换为 TypeConverter.Convert<DateTime>(args[0]),args[0]的来源于参数 currentDate的位于整个表达式参数首次出现的次序,其中相同的参 数会使用一个位置标量。例如a,b,c,b,d。其中最后一个b的参数形 式args[1]。

整个转换过程如下所示:

$<年>($<当前日期>)=>$<DateFunction.Year>($<currentDate>)=> DateFunction.Year(

TypeConverter.Convert<DateTime>(args[0]))

3、编译阶段,编译器504,通过转换阶段,编辑器获取了完整的C# 表达式语句,并组织成标准的“return表达式语句;”C#语句。通过 CodeDom构造出执行器类,并将该语句编译到执行器的执行函数中,创 建出表达式组件,并将其转换为二进制流持久化到数据库中。

4、执行阶段,执行器506,简单描述就是从数据库中,提取当前表 达式的二进制流。并通过加载器加载到内存中,并实例化该表达式组件。 然后通过缓存器缓存当前的表达式组件对象,并缓存当前表达式的时间戳 和标示,每次加载前都要进行对比,检测表达式是否发生变化。如果发生 变化,则需要通过卸载器将当前缓存中的表达式组件对象进行卸载处理。 之后重新进入加载程序。最后,直接调用该组件借口,将业务参数输入给 当前组件的表达式执行接口。如此实现了运行时和设计时互不干扰的业务 场景。

该过程实际上是表达式的运行时,系统会通过编辑器的运行时接口, 获取表达式需要传入的参数的字典,并为每一个参数按其类型进行赋值操 作,将调用编辑器的执行接口,执行该表达式。执行过程按如下步骤进 行:

■首先检查当前缓存中是否存在该表达式的组件的对象,如果 存在,则校验其时间戳是否发生变化,如果发生变化则执行第二 步。否则直接跳过第二步,进行第三部。

■通过加载器从库中读取表达式的组件的二进制流,并将其反 射为执行器组件对象,并缓存到当前的全局缓存中。

■执行器执行操作,根据用户提供的参数字典,将其按顺序组 织成参数数组,传入该执行器的执行函数中,并得出最终的结果。 如果期间发生错误,系统会直接返回空值或默认值。

通过以上技术方案,可以实现一种值表达式的设计和解析处理的方 法,既能有效解决自定义解析引擎的高复杂的问题,还可以提供面向业务 的易用性,并且支持一定程度上的复杂语句。

以上结合附图详细说明了本发明的技术方案,考虑到相关技术中,解 析引擎复杂、扩展性差,因此,本发明提供了一种表达式的解析处理系统 和方法可以有效解决构造动态解析引擎复杂度高的问题,还可以提供面向 业务的易用性,并且支持复杂的业务场景的要求。

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

去获取专利,查看全文>

相似文献

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

客服邮箱:kefu@zhangqiaokeyan.com

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

  • 服务号