CN107729001B - 一种表达式处理方法和装置 - Google Patents

一种表达式处理方法和装置 Download PDF

Info

Publication number
CN107729001B
CN107729001B CN201710806609.1A CN201710806609A CN107729001B CN 107729001 B CN107729001 B CN 107729001B CN 201710806609 A CN201710806609 A CN 201710806609A CN 107729001 B CN107729001 B CN 107729001B
Authority
CN
China
Prior art keywords
identifier
node
expression
prefix
matching
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201710806609.1A
Other languages
English (en)
Other versions
CN107729001A (zh
Inventor
胡勇
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Jingdong Century Trading Co Ltd
Beijing Jingdong Shangke Information Technology Co Ltd
Original Assignee
Beijing Jingdong Century Trading Co Ltd
Beijing Jingdong Shangke Information Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Jingdong Century Trading Co Ltd, Beijing Jingdong Shangke Information Technology Co Ltd filed Critical Beijing Jingdong Century Trading Co Ltd
Priority to CN201710806609.1A priority Critical patent/CN107729001B/zh
Publication of CN107729001A publication Critical patent/CN107729001A/zh
Application granted granted Critical
Publication of CN107729001B publication Critical patent/CN107729001B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computing Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种表达式处理方法和装置,涉及计算机技术领域。该方法的一具体实施方式包括:一种表达式处理方法,其特征在于,所述表达式是树型结构,所述表达式本身作为根节点,每个非根节点是其父节点的子表达式,每个节点包括前缀,所述前缀标识处理该节点的计算引擎,所述方法包括:步骤a,对所述表达式中的未处理的最低层的节点,调用该节点的计算引擎处理该节点以得到计算结果,并在所述表达式中,把该节点替换为所述计算结果;步骤b,确定该表达式中是否还存在未处理的节点,若存在,则转步骤a。该实施方式能够通过多种表达式引擎混合使用来计算表达式,结合多种表达式引擎的优点进行表达式计算。

Description

一种表达式处理方法和装置
技术领域
本发明涉及计算机技术领域,尤其涉及一种表达式处理方法和装置。
背景技术
表达式是由数字、算符、数字分组符号、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合。很多程序代码中都涉及到表达式的计算,目前代码中表达式的算术运算,都交给表达式引擎来完成。表达式引擎是第三方提供的表达式计算工具,其可以对字符串表达式进行四则运算、三目运算以及函数调用等等一系列处理,将表达式解析成计算机能识别的代码。
在实现本发明过程中,发明人发现现有技术中至少存在如下问题:每种表达式引擎的功能都有自己的局限性,且每种表达式引擎都有各自的特殊的调用方式、数据计算方法和所适用的特殊场景。而开发者在写程序代码时往往只能单独使用一种表达式引擎,然而只使用一种表达式计算引擎,就为表达式的计算带来了上述的局限性。
因此,亟需一种能够支持通过多种表达式引擎混合使用来计算表达式的表达式处理方法,实现由多种表达组合来完成一个算术运算。
发明内容
有鉴于此,本发明实施例提供一种表达式处理方法和装置,能够通过多种表达式引擎混合使用来计算表达式,结合多种表达式引擎的优点进行表达式计算。
为实现上述目的,根据本发明实施例的一个方面,提供了一种表达式处理方法,所述表达式是树型结构,所述表达式本身作为根节点,每个非根节点是其父节点的子表达式,每个节点包括前缀,所述前缀标识处理该节点的计算引擎,所述方法包括:
步骤a,对所述表达式中的未处理的最低层的节点,调用该节点的计算引擎处理该节点以得到计算结果,并在所述表达式中,把该节点替换为所述计算结果;
步骤b,确定该表达式中是否还存在未处理的节点,若存在,则转步骤a。
进一步的,所述节点除了前缀还包括:内容,所述节点的内容位于对应的左右标识符之间,
所述方法还包括:
构建所述树结构中所有节点的标识符对象,其中,所述标识符对象包括:节点的左右标识符的符号和位置,所述最低层的节点是在所述表达式中的节点中比较每个节点的标识符的位置获得的。
进一步的,所述标识符对象还包括:相应节点的前缀,其中,该节点对应的计算引擎是在预设的注册模块中通过所述前缀匹配确定的,其中,所述注册模块中预注册有一个或多个预设的计算引擎和其所对应的前缀名称。
进一步的,所述构建所述表达式中所有节点的标识符对象包括:
从左至右顺序地对所述表达式的每个字符执行下述标识符识别步骤:
判断当前字符是否是左右标识符,
若当前字符是左标识符,则创建该左标识符对应的节点的标识符对象,在该标识符对象中记录该左标识符的符号和位置,并匹配该左标识符对应的前缀,将匹配确定的前缀记录在该标识符对象中,然后将该标识符对象压入栈中,
若当前字符是右标识符,则把所述栈中栈顶的标识符对象出栈,并将该右标识符的符号和位置记录其中,
若当前字符不是左右标识符,则结束当前字符的标识符识别步骤。
进一步的,所述匹配该左标识符对应的前缀包括:
将所述注册模块中所有预注册的前缀名称作为匹配前缀,对每个匹配前缀执行下述匹配步骤,直至确定所述左标识符对应的匹配前缀:
从所述左标识符的位置起始向左截取n个字符,n为当前匹配前缀的长度值,判断截取到的字符是否与当前匹配前缀相同,若不相同,则结束当前匹配前缀的匹配步骤,
否则判断所述左标识符的位置是否与匹配前缀的长度相同,若相同,则确定当前匹配前缀为该左标识符对应的前缀,
若不相同,则获取从所述左标识符起始,其左侧的第m个字符,m为当前匹配前缀的长度值加1,判断该字符是否为预定义的规范字符,若不是,则确定当前匹配前缀为该左标识符对应的前缀,
否则结束当前匹配前缀的匹配步骤。
进一步的,在所述表达式中的节点中比较每个节点的标识符的位置获得所述最低层的节点包括:
将所有节点中的左标识符位置最大且前缀不为空的节点作为所述最低层的节点。
为实现上述目的,根据本发明实施例的另一个方面,提供了一种表达式处理装置,所述表达式是树型结构,所述表达式本身作为根节点,每个非根节点是其父节点的子表达式,每个节点包括前缀,所述前缀标识处理该节点的计算引擎,所述装置包括:
解析模块,用于步骤a,对所述表达式中的未处理的最低层的节点,调用该节点的计算引擎处理该节点以得到计算结果,并在所述表达式中,把该节点替换为所述计算结果;
判断模块,用于步骤b,确定该表达式中是否还存在未处理的节点,若存在,则转步骤a。
进一步的,所述节点除了前缀还包括:内容,所述节点的内容位于对应的左右标识符之间,
所述装置还包括:
对象构建模块,用于构建所述树结构中所有节点的标识符对象,其中,所述标识符对象包括:节点的左右标识符的符号和位置,所述最低层的节点是在所述表达式中的节点中比较每个节点的标识符的位置获得的。
进一步的,所述标识符对象还包括:相应节点的前缀,
所述装置还包括:
注册模块,用于预注册一个或多个预设的计算引擎和其所对应的前缀名称,
其中,所述解析模块进一步用于在所述注册模块中通过节点的所述前缀匹配确定该节点对应的计算引擎。
进一步的,所述对象构建模块进一步用于从左至右顺序地对所述表达式的每个字符执行下述标识符识别步骤:
判断当前字符是否是左右标识符,
若当前字符是左标识符,则创建该左标识符对应的节点的标识符对象,在该标识符对象中记录该左标识符的符号和位置,并匹配该左标识符对应的前缀,将匹配确定的前缀记录在该标识符对象中,然后将该标识符对象压入栈中,
若当前字符是右标识符,则把所述栈中栈顶的标识符对象出栈,并将该右标识符的符号和位置记录其中,
若当前字符不是左右标识符,则结束当前字符的标识符识别步骤。
进一步的,所述对象构建模块进一步用于将所述注册模块中所有预注册的前缀名称作为匹配前缀,对每个匹配前缀执行下述匹配步骤,直至确定所述左标识符对应的匹配前缀:
从所述左标识符的位置起始向左截取n个字符,n为当前匹配前缀的长度值,判断截取到的字符是否与当前匹配前缀相同,若不相同,则结束当前匹配前缀的匹配步骤,
否则判断所述左标识符的位置是否与匹配前缀的长度相同,若相同,则确定当前匹配前缀为该左标识符对应的前缀,
若不相同,则获取从所述左标识符起始,其左侧的第m个字符,m为当前匹配前缀的长度值加1,判断该字符是否为预定义的规范字符,若不是,则确定当前匹配前缀为该左标识符对应的前缀,
否则结束当前匹配前缀的匹配步骤。
进一步的,所述解析模块进一步用于将所有节点中的左标识符位置最大且前缀不为空的节点作为所述最低层的节点。
为实现上述目的,根据本发明实施例的另一个方面,提供了一种表达式处理电子设备,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明实施例提供的表达式处理方法。
为实现上述目的,根据本发明实施例的另一个方面,提供了一种计算机可读介质,其上存储有计算机程序,所述程序被处理器执行时实现本发明实施例提供的表达式处理方法。
本发明实施例提供的表达式处理方法和装置,提供了树型表达式结构,该表达式中通过前缀标识出了表达式本身以及其中嵌套组合的各个子表达式的处理方式,使得开发人员在撰写代码时,可以在一个表达式中,嵌套入多个需要采用不同表达式计算引擎的子表达式,实现多种表达式计算引擎语法结构的混合使用。通过本发明提供的表达式处理方法,树型表达式结构中多重嵌套的采用不同表达式计算引擎的子表达式逐一被对应的表达式计算引擎处理,最终完成对于表达式的处理,从而实现对于多种计算引擎语法结构混合使用的表达式的处理。应用本发明提供的上述方法,开发者可以最大限度利用各种开源的表达式计算引擎的优点进行混合开发,开发者不用关心各种表达式的实际调用过程,只需专注字符串表达式的书写。
上述的非惯用的可选方式所具有的进一步效果将在下文中结合具体实施方式加以说明。
附图说明
附图用于更好地理解本发明,不构成对本发明的不当限定。其中:
图1是本发明实施例提供的表达式处理方法的流程图;
图2是本发明实施例提供的标识符对象构建步骤的流程示意图;
图3是本发明实施例提供的匹配步骤的流程示意图;
图4是本发明实施例提供的表达式处理方法的应用流程示意图;
图5是本发明实施例提供的表达式处理装置的示意图;
图6是适于用来实现本发明实施例的电子设备的计算机系统的结构示意图。
具体实施方式
以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
本发明实施例提供一种表达式处理方法,其中,待处理的表达式是树型结构,表达式本身作为根节点,每个非根节点是其父节点的子表达式,每个节点包括前缀。
例如下述一个表达式:
exp(spel1()+prop(spel2())),
其中,exp(spel1()+prop(spel2()))为根节点,exp为该根节点的前缀,以该根节点为父节点的子节点有两个:spel1()和prop(spel2()),spel1()和prop(spel2())即表达式exp(spel1()+prop(spel2()))的两个子表达式,spel1和prop即上述两个表达式的前缀,以prop(spel2())节点为父节点的子节点为spel2(),spel2即该子节点的前缀,其中,左右括号内包括该子表达式的待处理的字符串(未示出),该字符串可以参照使用对应表达式引擎提供的语法格式。由本例可以看出,本发明提供的表达式的结构是在树型结构最低层的子表达式的基础上经过嵌套组合得到的。
在本发明,前缀标识处理对应节点的计算引擎,计算引擎即表达式计算引擎。如上例,前缀spel可以用来标识对应节点的表达式采用SpringEL表达式引擎进行处理,相对应的,该前缀对应的待处理的字符串可以参照使用SpringEL表达式引擎提供的语法格式。
本发明提供的树型表达式结构,通过前缀标识出了表达式本身以及其中嵌套组合的各个子表达式的处理方式,使得开发人员在撰写代码时,可以在一个表达式中,嵌套入多个需要采用不同表达式计算引擎的子表达式,实现多种表达式计算引擎语法结构的混合使用。
如图1所示,本发明实施例提供的表达式处理方法包括下述步骤a和步骤b。
步骤a,对表达式中的未处理的最低层的节点,调用该节点的计算引擎处理该节点以得到计算结果,并在表达式中,把该节点替换为计算结果。步骤a完成后执行步骤b,确定该表达式中是否还存在未处理的节点,若存在,则转步骤a。
首先,步骤a对树型表达式的最低层的节点的待处理的字符串采用该子表达式的前缀标识的表达式计算引擎进行处理,处理完成后,将该节点替换为计算结果,然后由步骤b判断表达式中是否还存在未处理的节点,若该表达式只有根节点,则其最低层的节点即该根节点本身,此时,表达式中不存在未处理的节点,对于该表达式的处理即结束。
如上例,当最低层的子表达式spel2()处理完成后,将该节点替换为计算结果xxx,替换后其父节点prop(spel2())即为prop(xxx),该父节点即成为此时未处理的最低层的子表达式,然后转步骤a采用前缀prop标识的表达式计算引擎对prop(xxx)进行处理,重复执行上述步骤a和步骤b直至根节点处理完毕,即完成对于表达式的处理。
通过上述本发明提供的表达式处理方法,树型表达式结构中多重嵌套的采用不同表达式计算引擎的子表达式逐一被对应的表达式计算引擎处理,最终完成对于表达式的处理,从而实现对于多种计算引擎语法结构混合使用的表达式的处理。
在本发明中,节点除了前缀还包括:内容,内容即指该表达式需要被对应的表达式引擎处理的字符串部分。节点的内容位于对应的左右标识符之间,例如一表达式:prefix(xxx),prefix为前缀,左右标识符采用左右括号,内容xxx位于左右括号之间。
本发明提供的表达式处理方法还包括下述标识符对象构建步骤,在该步骤中,构建树结构中所有节点的标识符对象,其中,标识符对象包括:节点的左右标识符的符号和位置,以及相应节点的前缀。
例如,一节点的标识符对象包括下述属性:
左标识符的符号(例如为左括号“(”),
右标识符的符号(例如为右括号“)”),
左标识符在表达式中的位置,
右标识符在表达式中的位置,
前缀。
作为本发明的一种实施方式,标识符对象中的左右标识符的位置可以由从表达式左端起始该左右标识符的字符序号来表示,如上例中的表达式prefix(xxx),从该表达式的左端起始,字符p的序号为0,对应的左标识符(即左括号)是第7个字符,其序号为6,则在标识符对象中该左括号的位置即为6。
在本发明中,最低层的节点是在表达式中的节点中比较每个节点的标识符对象中的标识符的位置获得的。即在步骤a中,首先比较未处理的每个节点的标识符对象中的左或者右标识符在表达式中的位置,通过比较获得树型结构表达式的最低层的节点。
在本发明中,节点对应的计算引擎是在预设的注册模块中通过标识符对象中的前缀匹配确定的,其中,注册模块中预注册有一个或多个预设的计算引擎和其所对应的前缀名称。即在步骤a中,在确定未处理的最低层的节点后,根据该节点的标识符对象中记录的前缀,在注册模块中进行匹配,若注册模块中有与标识符对象中记录的前缀相同的前缀名称,则确定该节点对应的计算引擎即注册模块中该相同的前缀名称对应的计算引擎。
下面结合一具体的实施方式对本发明提供的表达式处理方法进行更为详细的说明。
对于一个待处理的表达式,首先执行标识符对象构建步骤,构建该表达式中所有节点的标识符对象。如图2所示,标识符对象构建步骤包括:
把表示式转换为字符数组,然后循环遍历每个字符,即从左至右顺序地对表达式的每个字符执行下述标识符识别步骤:
首先,判断当前字符是否是左右标识符,若当前字符不是左右标识符,则结束当前字符的标识符识别步骤,然后对从左至右的下一个字符进行标识符识别步骤。
若当前字符是左标识符,则创建该左标识符对应的节点的标识符对象,在该标识符对象中记录该左标识符的符号和位置,并匹配该左标识符对应的前缀,将匹配确定的前缀记录在该标识符对象中,然后将该标识符对象压入栈中。其中,匹配该左标识符对应的前缀的具体过程,在本实施方式的后续内容中进行说明。
若当前字符是右标识符,则把栈中栈顶的标识符对象出栈,并将该右标识符的符号和位置记录其中,该标识符对象即创建完成。然后对从左至右的下一个字符进行标识符识别步骤。
例如,待处理表达式exp(spel1(ddd)+prop(spel2(yyy))),左右标识符的位置由从表达式左端起始该左右标识符的字符序号来表示,首字符的序号为0,创建完成的节点spel1(ddd)的标识符对象包括下述属性:“(”,“)”,9,13,spel1。
在上述标识符对象构建步骤中,本发明利用栈的先入后出的功能,在顺序遍历表达式的每个字符的过程中,通过压栈和出栈操作,实现将待处理表达式中每个节点的左右标识符记录在对应的同一标识符对象中。在本发明中,也可以通过后进先出的双向队列实现栈的功能。
在实际应用过程中,待处理的表达式有可能存在表达式中左标识符和右标识符不配对的错误情况,例如,(a+b)+c),)a+b),对于这种情况,为保证程序的正确性,当确定当前字符是右标识符,把栈中栈顶的标识符对象出栈前,需要先判断栈是否为空,若为空,则表明表达式的左右标识符不配对,结束对该待处理表达式的标识符对象构建步骤,不再进行对该表达式的处理。
若栈不为空,则把栈中栈顶的标识符对象出栈,然后进行进一步的判断,判断出栈的标识符对象中是否有右标识符存在,若有右标识符存在,则表明表达式的左右标识符不配对,结束对该待处理表达式的标识符对象构建步骤,不再进行对该表达式的处理。
若出栈的标识符对象中没有右标识符存在,则再进行后续步骤将该右标识符的符号和位置记录其中,经过上述两次判断即可实现对于待处理的表达式的校验。
在本实施方式中,上述匹配该左标识符对应的前缀的过程,如图3所示,包括:
将注册模块中所有预注册的前缀名称作为匹配前缀,循环遍历所有的匹配前缀,对每个匹配前缀执行下述匹配步骤,直至获得左标识符对应的匹配前缀:
从左标识符的位置起始向左截取n个字符,n为当前匹配前缀的长度值,判断截取到的字符是否与匹配前缀相同,若不相同,则结束当前匹配前缀的匹配步骤。否则判断左标识符的位置是否与匹配前缀的长度相同,若相同,则可进行后续的判断步骤。
在本实施方式中,待处理表达式中的前缀位于对应的左标识符的左侧,例如,当上述标识符识别步骤遍历到左标识符为节点prefix(xxx)的左标识符,若当前匹配步骤的匹配前缀为prop,该匹配前缀的长度为4个字符,从上述左标识符向左截取4个字符数据得到efix,efix与prop不相同,则结束prop的匹配步骤,将注册模块中的下一个匹配前缀作为当前匹配前缀,重新执行整个匹配步骤。
例如,若下一个匹配前缀为prefix,则截取得到字符即prefix,两者相同,然后进行下一步判断,判断左标识符的位置是否与匹配前缀的长度相同。在本实施方式中,左标识符的位置由从表达式左端起始该左标识符的字符序号来表示,表达式首字符序号为0,若相同,则表明当前的左标识符左边的前缀是表达式最外层的前缀,即根节点的前缀,其左侧即为表达式的左端,没有其他字符存在,因此,确定当前匹配前缀为该左标识符对应的前缀,然后结束对于所有的匹配前缀的循环遍历。
若左标识符的位置与匹配前缀的长度不相同,则获取从左标识符起始,其左侧的第m个字符,m为当前匹配前缀的长度值加1,例如,若当前匹配步骤的匹配前缀为prop,则从左标识符的位置起始向左获取第5个字符,判断该字符是否为预定义的规范字符,通过对于该字符的判断,可以用于区分当前左标识符左侧的字符是前缀还是表达式内容的一部分。例如,将本发明方法应用于面向对象编程语言Java的表达式处理时,该预定义的规范字符可以是Java命名规范。若该字符是预定义的规范字符,则表明当前左标识符左侧的字符是表达式内容的一部分,不是前缀,此时结束当前匹配前缀的匹配步骤,将注册模块中的下一个匹配前缀作为当前匹配前缀,重新执行整个匹配步骤。
若该字符不是预定义的规范字符,则表明当前左标识符左侧的字符是表达式的前缀,确定当前匹配前缀为该左标识符对应的前缀,然后结束对于所有的匹配前缀的循环遍历。
为了加快上述匹配步骤的匹配速度,在从左标识符的位置起始向左截取n个字符的步骤之前,在匹配步骤中可以先进行如下预判断:判断左标识符的位置是否小于当前匹配前缀的长度,若小于则表明当前左标识符左侧的字符显然与当前匹配前缀不同,结束当前匹配前缀的匹配步骤,将注册模块中的下一个匹配前缀作为当前匹配前缀,重新执行整个匹配步骤。若不小于,再进行后续的匹配步骤。
当对待处理表达式的所有字符循环遍历完成后,获得该表达式的标识符对象集合,如图4所示,在本发明步骤a中循环遍历标识符对象集合中的所有标识符对象,将所有节点中的左标识符位置最大且前缀不为空的节点作为最低层的节点,然后,根据该节点的标识符对象中记录的前缀,调用对应的表达式计算引擎来对该表达式中位于左右标识符之间的待处理内容进行处理获得计算结果。然后根据该节点的标识符对象中记录的左右标识符的位置,将左右标识符之间的内容替换为计算结果,从而得到新的表达式,然后执行步骤b进行循环直至表达式所有的节点计算完成得到表达式处理的最终结果。
作为本发明提供的表达式处理方法的一种实施方式,该方法可以与Spring开源框架整合使用。在该方法的配置过程中,创建表达式接口对象IExpress,所有表达式的使用都需要继承该接口,例如SpringEL表达式引擎的实现类SpelExpressImpl,Prop表达式引擎的实现类PropExpressImpl,Aviator表达式引擎的实现类AviatorExpressImpl。利用Spring开源框架的bean组件的后处理器BeanPostProcessor的功能,在创建表达式接口对象(IExpress)时,把该对象注册到表达式工厂(ExpressFactory)中以便使用,表达式工厂即可以实现本发明的注册模块的功能。在处理表达式的过程中,调用表达式服务类(ExpressService)的计算方法,然后调用表达式解析引擎(ExpressParserCustom)进行表达式解析,从而实现本发明标识符识别步骤,然后得到表达式最低层节点的标识符对象,从表达式工厂中根据标识符对象中的前缀找到对应的表达式计算引擎,再调用表达式计算引擎的计算方法进行表达式计算。
本发明实施例提供的表达式处理方法,提供了树型表达式结构,该表达式中通过前缀标识出了表达式本身以及其中嵌套组合的各个子表达式的处理方式,使得开发人员在撰写代码时,可以在一个表达式中,嵌套入多个需要采用不同表达式计算引擎的子表达式,实现多种表达式计算引擎语法结构的混合使用。通过本发明提供的表达式处理方法,树型表达式结构中多重嵌套的采用不同表达式计算引擎的子表达式逐一被对应的表达式计算引擎处理,最终完成对于表达式的处理,从而实现对于多种计算引擎语法结构混合使用的表达式的处理。应用本发明提供的上述方法,开发者可以最大限度利用各种开源的表达式计算引擎的优点进行混合开发,开发者不用关心各种表达式的实际调用过程,只需专注字符串表达式的书写。
本发明实施例还提供一种表达式处理装置,其中,表达式是树型结构,表达式本身作为根节点,每个非根节点是其父节点的子表达式,每个节点包括前缀,前缀标识处理该节点的计算引擎。
如图5所示,本发明实施例提供的表达式处理装置500包括:解析模块501和判断模块502。
解析模块501用于步骤a,对表达式中的未处理的最低层的节点,调用该节点的计算引擎处理该节点以得到计算结果,并在表达式中,把该节点替换为计算结果。
判断模块502用于步骤b,确定该表达式中是否还存在未处理的节点,若存在,则转步骤a。
在本发明中,节点除了前缀还包括:内容,节点的内容位于对应的左右标识符之间,本发明实施例提供的表达式处理装置还包括:对象构建模块,对象构建模块用于构建树结构中所有节点的标识符对象。其中,标识符对象包括:节点的左右标识符的符号和位置,最低层的节点是在表达式中的节点中比较每个节点的标识符的位置获得的。
在本发明中,标识符对象还包括:相应节点的前缀,本发明实施例提供的表达式处理装置还包括:注册模块,注册模块用于预注册一个或多个预设的计算引擎和其所对应的前缀名称。其中,解析模块进一步用于在注册模块中通过节点的所述前缀匹配确定该节点对应的计算引擎。
在本发明中,对象构建模块进一步用于从左至右顺序地对表达式的每个字符执行下述标识符识别步骤:
判断当前字符是否是左右标识符,
若当前字符是左标识符,则创建该左标识符对应的节点的标识符对象,在该标识符对象中记录该左标识符的符号和位置,并匹配该左标识符对应的前缀,将匹配确定的前缀记录在该标识符对象中,然后将该标识符对象压入栈中,
若当前字符是右标识符,则把栈中栈顶的标识符对象出栈,并将该右标识符的符号和位置记录其中,
若当前字符不是左右标识符,则结束当前字符的标识符识别步骤。
在本发明中,对象构建模块进一步用于将注册模块中所有预注册的前缀作为匹配前缀,对每个匹配前缀执行下述匹配步骤,直至获得左标识符对应的匹配前缀:
从左标识符的位置起始向左截取n个字符,n为当前匹配前缀的长度值,判断截取到的字符是否与当前匹配前缀相同,若不相同,则结束当前匹配前缀的匹配步骤,
否则判断左标识符的位置是否与匹配前缀的长度相同,若相同,则确定当前匹配前缀为该左标识符对应的前缀,
若不相同,则获取从左标识符起始,其左侧的第m个字符,m为当前匹配前缀的长度值加1,判断该字符是否为预定义的规范字符,若不是,则确定当前匹配前缀为该左标识符对应的前缀,
否则结束当前匹配前缀的匹配步骤。
在本发明中,解析模块进一步用于将所有节点中的左标识符位置最大且前缀不为空的节点作为最低层的节点。
本发明实施例提供的表达式处理装置,提供了树型表达式结构,该表达式中通过前缀标识出了表达式本身以及其中嵌套组合的各个子表达式的处理方式,使得开发人员在撰写代码时,可以在一个表达式中,嵌套入多个需要采用不同表达式计算引擎的子表达式,实现多种表达式计算引擎语法结构的混合使用。通过本发明提供的表达式处理方法,树型表达式结构中多重嵌套的采用不同表达式计算引擎的子表达式逐一被对应的表达式计算引擎处理,最终完成对于表达式的处理,从而实现对于多种计算引擎语法结构混合使用的表达式的处理。应用本发明提供的上述方法,开发者可以最大限度利用各种开源的表达式计算引擎的优点进行混合开发,开发者不用关心各种表达式的实际调用过程,只需专注字符串表达式的书写。
下面参考图6,其示出了适于用来实现本发明实施例的电子设备的计算机系统600的结构示意图。图6示出的电子设备仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图6所示,计算机系统600包括中央处理单元(CPU)601,其可以根据存储在只读存储器(ROM)602中的程序或者从存储部分608加载到随机访问存储器(RAM)603中的程序而执行各种适当的动作和处理。在RAM 603中,还存储有系统600操作所需的各种程序和数据。CPU 601、ROM 602以及RAM 603通过总线604彼此相连。输入/输出(I/O)接口605也连接至总线604。
以下部件连接至I/O接口605:包括键盘、鼠标等的输入部分606;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分607;包括硬盘等的存储部分608;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分609。通信部分609经由诸如因特网的网络执行通信处理。驱动器610也根据需要连接至I/O接口605。可拆卸介质611,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器610上,以便于从其上读出的计算机程序根据需要被安装入存储部分608。
特别地,根据本发明公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分609从网络上被下载和安装,和/或从可拆卸介质611被安装。在该计算机程序被中央处理单元(CPU)601执行时,执行本发明的系统中限定的上述功能。
需要说明的是,本发明所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本发明中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本发明中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本发明实施例中所涉及到的模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的模块也可以设置在处理器中,例如,可以描述为:一种处理器包括解析模块和判断模块。其中,这些模块的名称在某种情况下并不构成对该模块本身的限定,例如,解析模块还可以被描述为“对所述表达式中的未处理的最低层的节点,调用该节点的计算引擎处理该节点以得到计算结果,并在所述表达式中,把该节点替换为所述计算结果的模块”。
作为另一方面,本发明还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该设备包括:
步骤a,对所述表达式中的未处理的最低层的节点,调用该节点的计算引擎处理该节点以得到计算结果,并在所述表达式中,把该节点替换为所述计算结果,其中所述表达式是树型结构,所述表达式本身作为根节点,每个非根节点是其父节点的子表达式,每个节点包括前缀,所述前缀标识处理该节点的计算引擎;
步骤b,确定该表达式中是否还存在未处理的节点,若存在,则转步骤a。
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。

Claims (14)

1.一种表达式处理方法,其特征在于,所述表达式是树型结构,所述表达式本身作为根节点,每个非根节点是其父节点的子表达式,每个节点包括前缀,所述前缀标识处理该节点的计算引擎,所述方法包括:
步骤a,对所述表达式中的未处理的最低层的节点,调用该节点的计算引擎处理该节点以得到计算结果,并在所述表达式中,把该节点替换为所述计算结果;
步骤b,确定该表达式中是否还存在未处理的节点,若存在,则转步骤a。
2.根据权利要求1所述的方法,其特征在于,所述节点除了前缀还包括:内容,所述节点的内容位于对应的左右标识符之间,
所述方法还包括:
构建树结构中所有节点的标识符对象,其中,所述标识符对象包括:节点的左右标识符的符号和位置,所述最低层的节点是在所述表达式中的节点中比较每个节点的标识符的位置获得的。
3.根据权利要求2所述的方法,其特征在于,所述标识符对象还包括:相应节点的前缀,其中,该节点对应的计算引擎是在预设的注册模块中通过所述前缀匹配确定的,其中,所述注册模块中预注册有一个或多个预设的计算引擎和其所对应的前缀名称。
4.根据权利要求3所述的方法,其特征在于,所述构建所述表达式中所有节点的标识符对象包括:
从左至右顺序地对所述表达式的每个字符执行下述标识符识别步骤:
判断当前字符是否是左右标识符,
若当前字符是左标识符,则创建该左标识符对应的节点的标识符对象,在该标识符对象中记录该左标识符的符号和位置,并匹配该左标识符对应的前缀,将匹配确定的前缀记录在该标识符对象中,然后将该标识符对象压入栈中,
若当前字符是右标识符,则把所述栈中栈顶的标识符对象出栈,并将该右标识符的符号和位置记录其中,
若当前字符不是左右标识符,则结束当前字符的标识符识别步骤。
5.根据权利要求4所述的方法,其特征在于,所述匹配该左标识符对应的前缀包括:
将所述注册模块中所有预注册的前缀名称作为匹配前缀,对每个匹配前缀执行下述匹配步骤,直至确定所述左标识符对应的匹配前缀:
从所述左标识符的位置起始向左截取n个字符,n为当前匹配前缀的长度值,判断截取到的字符是否与当前匹配前缀相同,若不相同,则结束当前匹配前缀的匹配步骤,
否则判断所述左标识符的位置是否与匹配前缀的长度相同,若相同,则确定当前匹配前缀为该左标识符对应的前缀,
若不相同,则获取从所述左标识符起始,其左侧的第m个字符,m为当前匹配前缀的长度值加1,判断该字符是否为预定义的规范字符,若不是,则确定当前匹配前缀为该左标识符对应的前缀,
否则结束当前匹配前缀的匹配步骤。
6.根据权利要求3所述的方法,其特征在于,在所述表达式中的节点中比较每个节点的标识符的位置获得所述最低层的节点包括:
将所有节点中的左标识符位置最大且前缀不为空的节点作为所述最低层的节点。
7.一种表达式处理装置,其特征在于,所述表达式是树型结构,所述表达式本身作为根节点,每个非根节点是其父节点的子表达式,每个节点包括前缀,所述前缀标识处理该节点的计算引擎,所述装置包括:
解析模块,用于步骤a,对所述表达式中的未处理的最低层的节点,调用该节点的计算引擎处理该节点以得到计算结果,并在所述表达式中,把该节点替换为所述计算结果;
判断模块,用于步骤b,确定该表达式中是否还存在未处理的节点,若存在,则转步骤a。
8.根据权利要求7所述的装置,其特征在于,所述节点除了前缀还包括:内容,所述节点的内容位于对应的左右标识符之间,
所述装置还包括:
对象构建模块,用于构建树结构中所有节点的标识符对象,其中,所述标识符对象包括:节点的左右标识符的符号和位置,所述最低层的节点是在所述表达式中的节点中比较每个节点的标识符的位置获得的。
9.根据权利要求8所述的装置,其特征在于,所述标识符对象还包括:相应节点的前缀,
所述装置还包括:
注册模块,用于预注册一个或多个预设的计算引擎和其所对应的前缀名称,
其中,所述解析模块进一步用于在所述注册模块中通过节点的所述前缀匹配确定该节点对应的计算引擎。
10.根据权利要求9所述的装置,其特征在于,所述对象构建模块进一步用于从左至右顺序地对所述表达式的每个字符执行下述标识符识别步骤:
判断当前字符是否是左右标识符,
若当前字符是左标识符,则创建该左标识符对应的节点的标识符对象,在该标识符对象中记录该左标识符的符号和位置,并匹配该左标识符对应的前缀,将匹配确定的前缀记录在该标识符对象中,然后将该标识符对象压入栈中,
若当前字符是右标识符,则把所述栈中栈顶的标识符对象出栈,并将该右标识符的符号和位置记录其中,
若当前字符不是左右标识符,则结束当前字符的标识符识别步骤。
11.根据权利要求10所述的装置,其特征在于,所述对象构建模块进一步用于将所述注册模块中所有预注册的前缀名称作为匹配前缀,对每个匹配前缀执行下述匹配步骤,直至确定所述左标识符对应的匹配前缀:
从所述左标识符的位置起始向左截取n个字符,n为当前匹配前缀的长度值,判断截取到的字符是否与当前匹配前缀相同,若不相同,则结束当前匹配前缀的匹配步骤,
否则判断所述左标识符的位置是否与匹配前缀的长度相同,若相同,则确定当前匹配前缀为该左标识符对应的前缀,
若不相同,则获取从所述左标识符起始,其左侧的第m个字符,m为当前匹配前缀的长度值加1,判断该字符是否为预定义的规范字符,若不是,则确定当前匹配前缀为该左标识符对应的前缀,
否则结束当前匹配前缀的匹配步骤。
12.根据权利要求9所述的装置,其特征在于,所述解析模块进一步用于将所有节点中的左标识符位置最大且前缀不为空的节点作为所述最低层的节点。
13.一种表达式处理电子设备,其特征在于,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-6中任一所述的方法。
14.一种计算机可读介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现如权利要求1-6中任一所述的方法。
CN201710806609.1A 2017-09-08 2017-09-08 一种表达式处理方法和装置 Active CN107729001B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710806609.1A CN107729001B (zh) 2017-09-08 2017-09-08 一种表达式处理方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710806609.1A CN107729001B (zh) 2017-09-08 2017-09-08 一种表达式处理方法和装置

Publications (2)

Publication Number Publication Date
CN107729001A CN107729001A (zh) 2018-02-23
CN107729001B true CN107729001B (zh) 2020-11-24

Family

ID=61205875

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710806609.1A Active CN107729001B (zh) 2017-09-08 2017-09-08 一种表达式处理方法和装置

Country Status (1)

Country Link
CN (1) CN107729001B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110766433A (zh) * 2018-07-27 2020-02-07 北京国双科技有限公司 指标运算表达式的验证方法及装置
CN109325150B (zh) * 2018-08-06 2020-09-29 京东数字科技控股有限公司 基于表达式的大数据处理方法、装置、电子设备、存储介质
CN109492383B (zh) * 2018-11-09 2022-02-01 四川长虹电器股份有限公司 一种数据权限的解析方法
CN115169290A (zh) * 2022-07-19 2022-10-11 上海中汇亿达金融信息技术有限公司 用于标识表达式计算路径的方法

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101201836B (zh) * 2007-09-04 2010-04-14 浙江大学 基于带记忆确定有限自动机的正则表达式匹配加速方法
CN101645069B (zh) * 2008-08-04 2013-09-11 中国科学院计算机网络信息中心 一种多模式匹配中正则表达式存储压缩方法
US8972955B2 (en) * 2011-05-27 2015-03-03 Microsoft Technology Licensing Llc Reducing network trips for remote expression evaluation
CN102523219B (zh) * 2011-12-16 2015-01-14 清华大学 正则表达式匹配系统及匹配方法
CN105302842A (zh) * 2014-07-31 2016-02-03 北大方正集团有限公司 一种数据处理方法及装置
CN104615737A (zh) * 2015-02-10 2015-05-13 百度在线网络技术(北京)有限公司 一种基于搜索框的计算方法及装置

Also Published As

Publication number Publication date
CN107729001A (zh) 2018-02-23

Similar Documents

Publication Publication Date Title
CN107729001B (zh) 一种表达式处理方法和装置
US9015685B2 (en) Code analysis for simulation efficiency improvement
US8972936B2 (en) Version labeling in a version control system
US10019426B2 (en) Generating data format description language schema
CN110543297A (zh) 用于生成源码的方法和装置
CN113238740B (zh) 代码生成方法、代码生成装置、存储介质及电子设备
CN111600920B (zh) 基于js的数据请求代理方法、装置、设备及可读存储介质
CN114895908A (zh) 基于Web应用表达式的实现方法及系统、设备和存储介质
US20190073198A1 (en) Multi-flavored software execution from a singular code base
CN111124541B (zh) 一种配置文件的生成方法、装置、设备及介质
US9069863B2 (en) Identifying unknown parameter and name value pairs
CN116860286A (zh) 页面动态更新方法、装置、电子设备和计算机可读介质
CN111666218A (zh) 代码审计方法、装置、电子设备及介质
CN112579151A (zh) 一种模型文件的生成方法和装置
CN112860713B (zh) 用于获取图层数据的方法、电子设备和存储介质
CN109815455A (zh) 项目文件处理方法和装置
CN111367527B (zh) 一种语言处理的方法、装置、介质和电子设备
CN110489124B (zh) 源代码执行方法、装置、存储介质及计算机设备
CN114021133A (zh) 代码处理方法、装置、电子设备和存储介质
CN111626401B (zh) 运算方法及装置
CN109743310B (zh) 用于解析报文的方法和装置
CN112764761A (zh) 一种程序中断文件解析方法、存储介质、电子设备及系统
CN111078230A (zh) 一种代码生成方法和装置
CN111151008A (zh) 游戏运营数据的校验方法、装置、配置后台及介质
CN110858240A (zh) 一种前端模块加载方法和装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant