CN112230895A - 一种el表达式解析方法、装置、设备及存储介质 - Google Patents
一种el表达式解析方法、装置、设备及存储介质 Download PDFInfo
- Publication number
- CN112230895A CN112230895A CN202011118507.9A CN202011118507A CN112230895A CN 112230895 A CN112230895 A CN 112230895A CN 202011118507 A CN202011118507 A CN 202011118507A CN 112230895 A CN112230895 A CN 112230895A
- Authority
- CN
- China
- Prior art keywords
- expression
- parser
- mark
- character string
- node
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/24—Object-oriented
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
- G06F16/90335—Query processing
- G06F16/90344—Query processing by using string matching techniques
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Machine Translation (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明提供了一种EL表达式解析方法、装置、设备及存储介质,方法包括:获取待解析的EL表达式;其中,所述EL表达式包括按顺序排列的多个字符串;调用解析器组合对所述EL表达式进行解析,以形成包括多个标记的标记流;其中,所述解析器组合包括以链式连接形成的多个不同类型的解析器,每个解析器能够识别对应类型的字符串,并形成对应类型的标记;根据每个标记的类型,对所述标记流中的标记进行合并,生成最终计算节点;根据所述最终计算节点以及在运行过程中传入的参数进行EL表达式的计算求值。本发明相比现有技术能够提供非常高的性能和吞吐,提高了EL表达式的解析和计算效率。
Description
技术领域
本发明涉及计算机技术领域,特别涉及一种EL表达式解析方法、装置、设备及存储介质。
背景技术
在计算机中,表达式具有非常广泛的应用,因为表达式本身求值和逻辑运算的功能,因此比较常在需要进行文本模板运算的地方出现,作为在文本模板中动态属性的求值解决方案。也常常出现在逻辑判断或者条件判断的地方,作为一个具体的逻辑开发的求值解决方案。
Expression Language脚本表达式是一种广泛使用的技术。EL表达式本身只是制定了表达式语言的规范。实际的求值、计算工作是由对应的执行引擎来完成的,因此不同的执行引擎在表达式语言规范上都可以有自行添加、删改的权利。目前常见的表达式语言解析引擎都是从几个角度出发来实现的,主要有:
1、使用完整的脚本语言对表达式进行求值。比如Java语言内嵌了JS执行引擎,因此可以直接使用JS语言来进行表达式的书写,并且使用JS脚本引擎来实现表达式求值。其存在的缺陷是,因为使用了JS引擎实现脚本计算,因此难以扩展脚本语言的语法,也无法实现对Java中方法调用的实现
2、基于商用服务器提供的表达式引擎执行表达式计算,如Tomcat这类应用服务器就提供了JSP执行引擎。而JSP技术就定义了其自身的EL表达式语言规范。遵循这个规范并且在应用服务器环境之下,也可以使用表达式求值。由于其强依赖于应用容器本身提供的环境,在不同环境下,执行结果可能会略有差别,而且一旦脱离环境则无法使用。
3、自行实现表达式解析引擎。由于EL表达式本身可以被认为是一种简短的语言,因此可以为其执行抽象语法树AST,而后通过解析其AST结构,实现求值。此种方案实现的EL表达式解析引擎,可以自由定制语法结构,但是在运行时解析AST结构,性能损耗较大,实现出来的脚本引擎性能也不好,对于需要高效表达式求值的场景,吞吐量很难满足要求。
发明内容
有鉴于此,本发明的目的在于提供一种EL表达式解析方法、装置、设备及存储介质,能提供高性能和吞吐的EL表达式解析和计算。
本发明实施例提供了一种EL表达式解析方法,包括:
获取待解析的EL表达式;其中,所述EL表达式包括按顺序排列的多个字符串;
调用解析器组合对所述EL表达式进行解析,以形成包括多个标记的标记流;其中,所述解析器组合包括以链式连接形成的多个不同类型的解析器,每个解析器能够识别对应类型的字符串,并形成对应类型的标记;
根据每个标记的类型,对所述标记流中的标记进行合并,生成最终计算节点;
根据所述最终计算节点以及在运行过程中传入的参数进行EL表达式的计算求值。
优选地,所述调用解析器组合对所述EL表达式进行解析,以形成包括多个标记的标记流具体包括:
提取所述EL表达式的当前字符串;
将所述当前字符串输入至解析器组合,以经由所述解析器组合内的解析器依次进行识别,直至能够实现出所述当前字符串,获得与当前字符串对应的标记;
根据所述当前字符串的长度更新偏移量,以根据所述偏移量提取下一个字符串或者结束提取字符串的操作。
优选地,所述解析器组合内的解析器包括:
忽略字符解析器,用于跳过EL表达式中无需解析的字符串;
符号解析器,用于解析EL表达式中的符号;
类解析器,用于识别字符串的类型;
属性解析器,用于识别一个字符串是否需要对类属性或者实例属性的取值;
枚举解析器,用于识别一个字符串是否是一个具体的枚举值;
方法解析器,用于识别一个字符串是否是调用一个方法;
字符串解析器,用于识别一个字符串是否是一个纯文本内容;
数字解析器,用于识别一个字符串是否是数字;
变量识别器,用于识别一个字符串是否是变量名;
操作符识别器,用于识别四则运算操作符、三元操作符、关系操作符。
优选地,在将所述当前字符串输入至解析器组合,以经由所述解析器组合内的解析器依次进行识别,直至能够实现出所述当前字符串,获得与当前字符串对应的标记之后,还包括:
当判断当前标记的类型为预定的类型时,提取上一个识别得到的标记,并将当前标记与上一个标记进行合并生成可计算节点标记。
优选地,在将所述当前字符串输入至解析器组合,以经由所述解析器组合内的解析器依次进行识别,直至能够实现出所述当前字符串,获得与当前字符串对应的标记之后,还包括:
当判断当前标记的类型为预定的类型时,从而已识别的标记流中回溯以获取与当前标记对应的标记,且将这两个标记之间的标记合并得到一个代表值的值标记;
从已识别的标记流中提取出一个预定的标记;所述预定的标记为类型为数组、队列或者Map结构;
将所述值标记与所述预定的标记进行合并生成一个可计算节点标记。
优选地,根据每个标记的类型,对所述标记流中的标记进行合并,生成最终计算节点,具体为:
对所述标记流中的不可计算标记进行合并,生成可计算节点标记;其中,所述不可计算标记包括单一的操作符、数字、字符串;
将所有的可计算节点标记进行合并,生成最终计算节点。
优选地,所述操作符包括二元操作符与三元操作符,不同的操作符具有不同的优先级,且二元操作符的优先级大于三元操作符;
则对所述标记流中的不可计算标记进行合并,生成可计算节点标记具体包括:
对二元操作符,获取当前优先级;其中,优先级数值越大,优先级越高;
对所述标记流从左至右扫描以查找符合当前优先级的操作符,并弹出该操作符及其左右两侧的标记,将三个标记合并为一个新的可计算节点,并且压回到标记流中;
在扫描结束对所述优先级自减1以更新当前优先级,直至遍历所有优先级;
判断合并后的标记流中是否存在三元表达式存在;
若存在,则对合并后的标记流从右至左扫描,当扫描到一个“?”符号后,向右寻找最接近的“:”符号,此时截取“?”左侧,右侧,“:”右侧三个操作数合并成为一个计算三元表达式的可计算标记,压回到标记流中;
重头开始扫描,直到无法再扫描到“?”符号为止。
本发明实施例还提供了一种EL表达式解析装置,包括:
获取单元,用于获取待解析的EL表达式;其中,所述EL表达式包括按顺序排列的多个字符串;
解析单元,用于调用解析器组合对所述EL表达式进行解析,以形成包括多个标记的标记流;其中,所述解析器组合包括以链式连接形成的多个不同类型的解析器,每个解析器能够识别对应类型的字符串,并形成对应类型的标记;
合并单元,用于根据每个标记的类型,对所述标记流中的标记进行合并,生成最终计算节点;
计算单元,用于根据所述最终计算节点以及在运行过程中传入的参数进行EL表达式的计算求值。
本发明实施例还提供了一种EL表达式解析设备,包括存储器以及处理器,所述存储器内存储有计算机程序,所述计算机程序能够被所述处理器执行,以实现如上述的EL表达式解析方法。
本发明实施例还提供了一种计算机可读存储介质,存储有计算机程序,所述计算机程序能够被所述计算机可读存储介质所在设备的处理器执行,以实现如上述的EL表达式解析方法。
本实施例提供的EL表达式解析方法,通过将字符串的不同内容视为不同的Token流,通过不同的解析器,以链式组合的方式,识别出所有的Token,再通过Token合并的方式,最终生成唯一一个可以执行计算的可计算节点用于在运行期传入参数实现EL表达式的计算求值,本实施例相比现有技术能够提供非常高的性能和吞吐,提高了EL表达式的解析和计算效率。
附图说明
为了更清楚地说明本发明实施方式的技术方案,下面将对实施方式中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1是本发明第一实施例提供的EL表达式解析方法的流程示意图。
图2是解析器对EL表达式进行解析的流程示意图。
图3是对二元操作符进行合并的流程示意图。
图4是对三元操作符进行合并的流程示意图。
图5是本发明第二实施例提供的EL表达式解析装置的结构示意图。
具体实施方式
为使本发明实施方式的目的、技术方案和优点更加清楚,下面将结合本发明实施方式中的附图,对本发明实施方式中的技术方案进行清楚、完整地描述,显然,所描述的实施方式是本发明一部分实施方式,而不是全部的实施方式。基于本发明中的实施方式,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施方式,都属于本发明保护的范围。因此,以下对在附图中提供的本发明的实施方式的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施方式。基于本发明中的实施方式,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施方式,都属于本发明保护的范围。
请参阅图1,本发明第一实施例提供了一种EL表达式解析方法,其可由EL表达式解析设备(以下简称解析设备)来执行,以实现如下步骤:
S101,获取待解析的EL表达式;其中,所述EL表达式包括按顺序排列的多个字符串。
S102,调用解析器组合对所述EL表达式进行解析,以形成包括多个标记的标记流;其中,所述解析器组合包括以链式连接形成的多个不同类型的解析器,每个解析器能够识别对应类型的字符串,并形成对应类型的标记。
在本实施例中,要能够实现EL表达式的计算,需要有计算式和计算参数。其中,计算参数是在运行中由外部提供,而计算式则是通过对字符串形式的EL表达式解析而出。因此第一步就是如何将EL表达式转化为计算式。计算式可以看成是多种操作符以及配合这些操作符的操作数结合在一起,按照特定规则实现的一种运算。比如,1+2>3就可以看成两个操作符“+”和“>”和三个操作数1、2、3的运算,因为操作符“+”的优先级大于“>”,因此先执行操作符“+”,该操作符需要左右两个操作数,也就是1和2,就得到结果3。接着执行操作符“>”,该操作符实现左右两个操作数的比较,因此此时左右两个操作数都是3,因此比较结果为false,也就得到了表达式最终的值为false。
从上述例子可以看出,要能实现EL表达式的计算,首先需要将字符串形式的EL表达式转换为和字符串顺序一致的操作数和操作符的流。这里面的操作数和操作符会有多种类型。比如说操作符包括四则运算的,大小比较,布尔运算等等。而操作数也可能会有数字,字符串、类、枚举等。
在本实施例中,这里将字符串转换为的各种操作符和操作数统称为标记,即Token。
其中,为了实现对EL表达式的解析,本实施例针对不同种类的字符串,比如运算表达符(诸如+、*、>=)、符号(诸如(、])、数字(诸如9,-18),都创建一个解析器。每个解析器只用于识别对应类型的字符串,如果能够识别,则生成对应类型的Token,如果无法识别,则将需要解析的字符串交给下一个解析器进行识别。对字符串的解析,是一个循环的链式处理的过程。也就是说,将所有的解析器形成一个处理链路,传入需要解析的字符串,每一个解析器分别对当前的字符串进行识别,如果识别到则将该Token放入已经识别的队列中,并返回下次解析的偏移量。
在本实施例中,如图2所示,将EL表达式的字符串解析为一个个Token的任务,并不需要一次性解析出全部的Token。可以进行多轮次的扫描,每一次扫描都解析出一个Token,扫描成功,则给出下次解析的偏移量(偏移量根据当前字符串的长度生成)。下次解析的时候将按照新的偏移量读取字符串,尝试解析下一个Token。重复这个过程,直到将偏移量移动到字符串的末尾,此时就解析出了所有的Token。如果使用所有的解析器都无法识别到新的Token,则返回原本的偏移量。所述解析设备发现扫描后给出的新偏移量和扫描之前的入参偏移量相同的话,意味着本轮次扫描无法识别新的Token,则意味着该EL表达式并不是合法的表达式,抛出异常提示非法表达式并且终止流程。
在本实施例中,特别的,包括但不限于如下解析器:
忽略字符解析器,用于跳过EL表达式中无需解析的字符串;
符号解析器,用于解析EL表达式中的符号;
类解析器,用于识别字符串的类型;
属性解析器,用于识别一个字符串是否需要对类属性或者实例属性的取值;
枚举解析器,用于识别一个字符串是否是一个具体的枚举值;
方法解析器,用于识别一个字符串是否是调用一个方法;
字符串解析器,用于识别一个字符串是否是一个纯文本内容;
数字解析器,用于识别一个字符串是否是数字;
变量识别器,用于识别一个字符串是否是变量名;
操作符识别器,用于识别四则运算操作符、三元操作符、关系操作符。
当然,在实际的情况中,可根据实际的需要构建更多的解析器,且解析器之间的顺序可根据实际需要进行排列,本发明不做具体限定。
S103,根据每个标记的类型,对所述标记流中的标记进行合并,生成最终计算节点。
在本实施例中,一个合法的EL表达式经过上述解析流程后,就会形成一个Token流。此时,Token流中的每一个Token都可以看成是一个可以计算的节点。显然,一个EL表达式的计算需要经过这么多节点是不可取的。所以需要将所有Token进行合并,直到形成一个唯一的最终计算节点。
实际上,在第一阶段的解析过程中,由于每一个解析器只识别自身的Token,而有些Token单独是无法承担计算职责的,也需要和上下文中的Token合并后,才能成为一个具备计算能力的节点。因此,在解析的过程中就需要对一些Token进行合并,以提高效率和保证功能正确。
例如,当属性解析器识别到一个字符串是属性的时候,该属性并不能独立的完成计算,因为需要知道该属性是一个类型属性还是实例属性,并且与对应的类或者实例(可以在运行时计算的时候得到)进行绑定,才能参与计算。因此当一个属性类别的Token被解析出来后,属性解析器并没有马上返回新的偏移量,而是弹出上一个被解析出来的Token,并且将该Token与当前的属性Token合并为一个全新的Token,如果弹出的上一个Token的类别是Class类型,则全新的Token就拥有类对象本身和需要取值的类属性名称,显然这些足以在运行时进行计算从而取得需要计算的值。如果弹出的上一个Token类别是实例,则全新的Token就拥有实例对象计算节点和需要取值的实例属性名称,这些就足以在运行时计算出该实例属性的值了。当新的Token产生后,就需要将该Token压回到Token流中。
又比如,方法解析器识别到一个字符串是方法名时,会产生一个方法名Token,该Token并不能执行有效计算,因为不知道方法的调用主体。所以当方法名Token产生的时候,并不是直接压入Token流中,而是弹出上一个Token,如果是类别是Class类型,则合并2个Token成为一个新的方法调用Token,调用主体是类,方法名是当前方法名Token的内容。如果上一个Token是实例类型,则合并2个Token成为一个新的方法调用Token,调用主体是实例,方法名是当前方法名Token的内容。当新的Token产生后,就需要将该Token压入到Token流之中。
再比如,符号解析器识别到一个“]”的时候,该符号Token是无法单独计算的,此时就会从Token流中回溯,直到匹配到一个“[”,并且将这之间的Token合并完成一个代表值的值Token,该值Token要么代表需要从数组或者队列的下标中取;要么代表着需要从一个Map结构中取得Key对应的Value。但是单独的值Token还是不足以完成计算,因此需要再从Token流中弹出一个Token,该Token可能是一个数组或者队列,也可能是一个Map结构,这需要运行期才能再次确定。可以明确的是,该Token与值Token合并成为一个新的计算节点Token,并且将该结算节点Token压回到Token流中。方法表达式本身是一种嵌套的结构,也就是方法表达式本身可以由多个方法表达式构成。比如1+2*(5-9)这个表达式中由“()”包裹的5-9就是一个完整的表达式。因此当符号解析器识别到)时,就会从Token流中回溯,直到匹配到一个“(”,并且将这之间的Token视作一个完整的表达式,执行整体的Token合并得到一个可计算节点Token,再压回到Token流之中。
从上面的分析可以看到,经过第一步合并生成的Token流中应该只有两种情况:
可计算节点Token,这种可能是属性求值,方法求值、枚举、类对象等。
不可计算节点Token,比如单一的操作符、数字、字符串等。
对于可计算节点Token,都是在第一步解析过程中就已经完成合并的,第二步的处理并不针对他们。第二步合并是针对第一步解析之后不可计算节点,更确切的说第二步合并是将操作符与对应的操作符合并,形成可计算的节点。之所以合并会有两次,是因为在Token解析阶段就实现的合并,都是可以即时执行的,且都是向前进行合并。而操作符则存在优先级的问题,需要等到整个表达式都解析完毕后,才能按照优先级的顺序,从高到低的完成。例如,1-2*3显然应该先计算2*3得到6,然后计算1-6得到最终结果-5;而不是按照从左至右的顺序依次完成操作符的计算。
基于上面的考虑,本实施例的操作符从优先级的角度来划分,可以分为5个等级,如下:
等级5:乘法、除法、取余;
等级4:加法、减法;
等级3:判断符号,如==、>等;
等级2:逻辑符号,如&&、||;
等级1:三元操作符,也就是?和:的组合;
其中,除了等级1外,其余等级的操作符都是二元操作符,其操作数分别是左右两边的Token。而等级1的三元操作符则有3个操作数,被两个操作符?和:给分开。因此操作符合并的流程也对应的分为两个步骤:
步骤(1),如图3所示,从等级5开始到等级2结束,从左至右扫描符合当前优先级的操作符,弹出该操作符及其左右两侧的Token,将三个Token合并为一个新的可计算节点Token,并且压回到Token流中。扫描结束将等级减1,重复该流程直到等级2也完成对应的扫描动作
步骤(2),如图4所示,经过上述扫描动作后,此时的Token流中,要么只有一个可计算节点Token,要么就是有三元表达式或者嵌套形式的三元表达式存在。
此时,从右至左扫描,扫描到一个“?”符号后,就向右寻找最接近的“:”符号,此时截取“?”左侧,右侧,“:”右侧三个操作数合并成为一个计算三元表达式可计算节点Token,压回到Token流中。重头开始扫描流程,直到无法再扫描到“?”符号为止,此时Token流中如只有一个可计算Token,则为合法结果。
S104,根据所述最终计算节点以及在运行过程中传入的参数进行EL表达式的计算求值。
在本实施例中,经过上述的合并后,一个合法的表达式就只会有一个可计算节点Token。此时表达式的解析就完成了,运行时只需要填入参数就可以完成对应的计算。
其中,本实施例所称的可计算节点是可以直接执行求值的节点。为了实现上的简化,本实施例将可计算节点和Token节点使用同一个接口来实现。在第一步Token解析的过程中,是将EL表达式的字符串解析为Token节点,此时转换出来的节点大多数都不具备执行求值能力。或者说,此时被转换出来的节点是不完整的,因此不具备求值能力。
比如说,符号-可以被解析为减号。显然,此时该计算节点只有操作符,还没有设置对应的操作数。只有等到完整的解析合并流程都完成,这个计算节点被设置了操作数,才能实现求值。
在本实施例中,计算节点有很多不同的种类,如:方法求值节点、操作符节点、数字节点、实例属性求值节点、类属性求值节点、关键字求值节点、枚举类求值节点、符号节点、字符串求值节点、变量求值节点、操作结果求值节点。
计算的流程是很简单的,因为EL表达式经过解析、合并之后会得到唯一的可计算节点。只需要将参数集合,也就是键值对形式的参数结构传入该可计算节点,就按照各自计算节点的规则执行计算。在计算的过程中,会遇到先需要对内部计算节点先求值计算的情况,只需要按照对应的规则执行即可,最终计算节点得出求值结果。
综上所述,本实施例提供的EL表达式解析方法,通过将字符串的不同内容视为不同的Token流,通过不同的解析器,以链式组合的方式,识别出所有的Token,再通过Token合并的方式,最终生成唯一一个可以执行计算的可计算节点用于在运行期传入参数实现EL表达式的计算求值,本实施例相比现有技术能够提供非常高的性能和吞吐,提高了EL表达式的解析和计算效率。
以下对本发明的一些优选实施例做更进一步的描述。
1、解析器
上述实施例中,针对不同类型的Token,会有不同的解析器来进行对应的字符串判断和解析工作。而且解析器本身是一个链式的处理流程。为此,本实施例在这里对解析器的接口定义如下:
其中,Invoker可以看成是一个NodeParser的包装器,每一个Invoker会持有一个NodeParser节点,并且持有下一个Invoker对象。当解析的时候,外部调用Invoker的方法,而Invoker则将入参数据和下一个Invoker引用传递给NodeParser执行解析以及没有解析到的时候传递给下一个Invoker。
2、计算节点
在上述实施例中提到,为了更高效的处理代码,将Token合并到计算节点中,使用计算节点来直接表示计算节点。只不过有的计算节点在被解析完毕后就是具备计算能力的,而有些节点在刚解析出来的时候本身并不是完整的。比如方法调用节点,在刚解析出来的时候,只有调用者信息和方法名信息,只有等待后续解析中,将方法入参都解析完毕,并且将信息合并到该方法节点时,该方法调用节点才是完整的,可以执行计算。
为此,本实施例对计算节点的接口进行了如下定义:
public interface Invoker
{
int parse(String el,int offset,Deque<CalculateNode>nodes,intfunction);
}public abstract class NodeParser
{
//在解析完成后返回新的偏移量
public abstract int parse(String el,int offset,Deque<CalculateNode>nodes,
int function,Invoker next);
}public interface CalculateNode
{
Object calculate(Map<String,Object>variables);
Token token();
String literals();
}public interface MethodNode extends CalculateNode
{
void setArgsNodes(CalculateNode[]argsNodes);
}public interface QuestionNode extends CalculateNode
{
void setConditionNode(CalculateNode node);
void setLeftNode(CalculateNode node);
void setRightNode(CalculateNode node);
}public abstract class OperatorResultNode implements CalculateNode
{
protected OperatorResultNode(Operator type){this.type=type;}
public void setLeftOperand(CalculateNode node){leftOperand=node;}
public void setRightOperand(CalculateNode node){rightOperand=node;}
}
CalculateNode.token(计算节点)方法会返回当前该计算节点的Token标识。Token标识指代着计算节点的类型,比如是属性求值,方法求值,变量求值等等。
计算节点有多个实现类,具体上而言都是根据每一种计算节点的规则实现具体的计算步骤。比如“+”操作符节点就是先计算做操作数得到返回值,再计算右操作数的返回值。如果两者之中任意一个的返回值为字符串类型,则“+”的执行逻辑就是将两者视为字符串拼接,并且返回拼接结果。否则的话,就将两者视为数字,执行数学上的加法计算,得到结果后返回。
又比如“||”操作符节点就是先计算左操作数。如果计算得到的结果是一个布尔变量且为true的话,则整体表达式返回值为true。如果左操作数计算结果是一个数字且为正数的话,整体表达式返回true。如果上述两种情况都不存在,则计算右操作数,如果右操作数计算结果是一个布尔变量且为true,或者计算结果是一个数字且为正数,则整体返回true。如果上述情况都不存在,则整体返回false。
请参阅图5,本发明第二实施例还提供了一种EL表达式解析装置,包括:
获取单元210,用于获取待解析的EL表达式;其中,所述EL表达式包括按顺序排列的多个字符串;
解析单元220,用于调用解析器组合对所述EL表达式进行解析,以形成包括多个标记的标记流;其中,所述解析器组合包括以链式连接形成的多个不同类型的解析器,每个解析器能够识别对应类型的字符串,并形成对应类型的标记;
合并单元230,用于根据每个标记的类型,对所述标记流中的标记进行合并,生成最终计算节点;
计算单元240,用于根据所述最终计算节点以及在运行过程中传入的参数进行EL表达式的计算求值。
本发明第三实施例还提供了一种EL表达式解析设备,包括存储器以及处理器,所述存储器内存储有计算机程序,所述计算机程序能够被所述处理器执行,以实现如上述的EL表达式解析方法。
本发明第四实施例还提供了一种计算机可读存储介质,存储有计算机程序,所述计算机程序能够被所述计算机可读存储介质所在设备的处理器执行,以实现如上述的EL表达式解析方法。
在本发明实施例所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置和方法实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本发明的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
另外,在本发明各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,电子设备或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种EL表达式解析方法,其特征在于,包括:
获取待解析的EL表达式;其中,所述EL表达式包括按顺序排列的多个字符串;
调用解析器组合对所述EL表达式进行解析,以形成包括多个标记的标记流;其中,所述解析器组合包括以链式连接形成的多个不同类型的解析器,每个解析器能够识别对应类型的字符串,并形成对应类型的标记;
根据每个标记的类型,对所述标记流中的标记进行合并,生成最终计算节点;
根据所述最终计算节点以及在运行过程中传入的参数进行EL表达式的计算求值。
2.根据权利要求1所述的EL表达式解析方法,其特征在于,所述调用解析器组合对所述EL表达式进行解析,以形成包括多个标记的标记流具体包括:
提取所述EL表达式的当前字符串;
将所述当前字符串输入至解析器组合,以经由所述解析器组合内的解析器依次进行识别,直至能够实现出所述当前字符串,获得与当前字符串对应的标记;
根据所述当前字符串的长度更新偏移量,以根据所述偏移量提取下一个字符串或者结束提取字符串的操作。
3.根据权利要求1所述的EL表达式解析方法,其特征在于,所述解析器组合内的解析器包括:
忽略字符解析器,用于跳过EL表达式中无需解析的字符串;
符号解析器,用于解析EL表达式中的符号;
类解析器,用于识别字符串的类型;
属性解析器,用于识别一个字符串是否需要对类属性或者实例属性的取值;
枚举解析器,用于识别一个字符串是否是一个具体的枚举值;
方法解析器,用于识别一个字符串是否是调用一个方法;
字符串解析器,用于识别一个字符串是否是一个纯文本内容;
数字解析器,用于识别一个字符串是否是数字;
变量识别器,用于识别一个字符串是否是变量名;
操作符识别器,用于识别四则运算操作符、三元操作符、关系操作符。
4.根据权利要求2所述的EL表达式解析方法,其特征在于,在将所述当前字符串输入至解析器组合,以经由所述解析器组合内的解析器依次进行识别,直至能够实现出所述当前字符串,获得与当前字符串对应的标记之后,还包括:
当判断当前标记的类型为预定的类型时,提取上一个识别得到的标记,并将当前标记与上一个标记进行合并生成可计算节点标记。
5.根据权利要求2所述的EL表达式解析方法,其特征在于,在将所述当前字符串输入至解析器组合,以经由所述解析器组合内的解析器依次进行识别,直至能够实现出所述当前字符串,获得与当前字符串对应的标记之后,还包括:
当判断当前标记的类型为预定的类型时,从而已识别的标记流中回溯以获取与当前标记对应的标记,且将这两个标记之间的标记合并得到一个代表值的值标记;
从已识别的标记流中提取出一个预定的标记;所述预定的标记为类型为数组、队列或者Map结构;
将所述值标记与所述预定的标记进行合并生成一个可计算节点标记。
6.根据权利要求4或5所述的EL表达式解析方法,其特征在于,根据每个标记的类型,对所述标记流中的标记进行合并,生成最终计算节点,具体为:
对所述标记流中的不可计算标记进行合并,生成可计算节点标记;其中,所述不可计算标记包括单一的操作符、数字、字符串;
将所有的可计算节点标记进行合并,生成最终计算节点。
7.根据权利要求6所述的EL表达式解析方法,其特征在于,所述操作符包括二元操作符与三元操作符,不同的操作符具有不同的优先级,且二元操作符的优先级大于三元操作符;
则对所述标记流中的不可计算标记进行合并,生成可计算节点标记具体包括:
对二元操作符,获取当前优先级;其中,优先级数值越大,优先级越高;
对所述标记流从左至右扫描以查找符合当前优先级的操作符,并弹出该操作符及其左右两侧的标记,将三个标记合并为一个新的可计算节点,并且压回到标记流中;
在扫描结束对所述优先级自减1以更新当前优先级,直至遍历所有优先级;
判断合并后的标记流中是否存在三元表达式存在;
若存在,则对合并后的标记流从右至左扫描,当扫描到一个“?”符号后,向右寻找最接近的“:”符号,此时截取“?”左侧,右侧,“:”右侧三个操作数合并成为一个计算三元表达式的可计算标记,压回到标记流中;
重头开始扫描,直到无法再扫描到“?”符号为止。
8.一种EL表达式解析装置,其特征在于,包括:
获取单元,用于获取待解析的EL表达式;其中,所述EL表达式包括按顺序排列的多个字符串;
解析单元,用于调用解析器组合对所述EL表达式进行解析,以形成包括多个标记的标记流;其中,所述解析器组合包括以链式连接形成的多个不同类型的解析器,每个解析器能够识别对应类型的字符串,并形成对应类型的标记;
合并单元,用于根据每个标记的类型,对所述标记流中的标记进行合并,生成最终计算节点;
计算单元,用于根据所述最终计算节点以及在运行过程中传入的参数进行EL表达式的计算求值。
9.一种EL表达式解析设备,其特征在于,包括存储器以及处理器,所述存储器内存储有计算机程序,所述计算机程序能够被所述处理器执行,以实现如权利要求1至7任意一项所述的EL表达式解析方法。
10.一种计算机可读存储介质,其特征在于,存储有计算机程序,所述计算机程序能够被所述计算机可读存储介质所在设备的处理器执行,以实现如权利要求1至7任意一项所述的EL表达式解析方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011118507.9A CN112230895B (zh) | 2020-10-19 | 2020-10-19 | 一种el表达式解析方法、装置、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011118507.9A CN112230895B (zh) | 2020-10-19 | 2020-10-19 | 一种el表达式解析方法、装置、设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112230895A true CN112230895A (zh) | 2021-01-15 |
CN112230895B CN112230895B (zh) | 2023-06-23 |
Family
ID=74118920
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011118507.9A Active CN112230895B (zh) | 2020-10-19 | 2020-10-19 | 一种el表达式解析方法、装置、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112230895B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115169290A (zh) * | 2022-07-19 | 2022-10-11 | 上海中汇亿达金融信息技术有限公司 | 用于标识表达式计算路径的方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6120552A (en) * | 1998-05-27 | 2000-09-19 | International Business Machines Corporation | Method to exhibit parallelism for computer implementation of computational processing |
CN101727073A (zh) * | 2008-10-27 | 2010-06-09 | 北京广利核系统工程有限公司 | 一种满足时标传递的开关量逻辑运算方法 |
CN104408544A (zh) * | 2014-10-28 | 2015-03-11 | 用友优普信息技术有限公司 | 公式解析装置和方法 |
CN109783702A (zh) * | 2018-12-27 | 2019-05-21 | 国网上海市电力公司 | 一种基于二叉树的字符串表达式计算方法及装置 |
CN111580830A (zh) * | 2020-05-12 | 2020-08-25 | 北京飞漫软件技术有限公司 | 超文本标记语言文档元素的绑定及解析方法 |
-
2020
- 2020-10-19 CN CN202011118507.9A patent/CN112230895B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6120552A (en) * | 1998-05-27 | 2000-09-19 | International Business Machines Corporation | Method to exhibit parallelism for computer implementation of computational processing |
CN101727073A (zh) * | 2008-10-27 | 2010-06-09 | 北京广利核系统工程有限公司 | 一种满足时标传递的开关量逻辑运算方法 |
CN104408544A (zh) * | 2014-10-28 | 2015-03-11 | 用友优普信息技术有限公司 | 公式解析装置和方法 |
CN109783702A (zh) * | 2018-12-27 | 2019-05-21 | 国网上海市电力公司 | 一种基于二叉树的字符串表达式计算方法及装置 |
CN111580830A (zh) * | 2020-05-12 | 2020-08-25 | 北京飞漫软件技术有限公司 | 超文本标记语言文档元素的绑定及解析方法 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115169290A (zh) * | 2022-07-19 | 2022-10-11 | 上海中汇亿达金融信息技术有限公司 | 用于标识表达式计算路径的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN112230895B (zh) | 2023-06-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10620945B2 (en) | API specification generation | |
JP4427500B2 (ja) | 意味解析装置、意味解析方法および意味解析プログラム | |
US20040049768A1 (en) | Method and program for compiling processing, and computer-readable medium recoding the program thereof | |
CN112699665B (zh) | 一种安全报告文本的三元组抽取方法、装置及电子设备 | |
CN104063314B (zh) | 一种测试数据自动生成装置及方法 | |
CN112989348B (zh) | 攻击检测方法、模型训练方法、装置、服务器及存储介质 | |
CN110765235A (zh) | 训练数据的生成方法、装置、终端及可读介质 | |
CN110096599B (zh) | 知识图谱的生成方法及装置 | |
CN112416787A (zh) | 基于java的项目源码扫描分析方法、系统及存储介质 | |
CN112307719B (zh) | 一种基于n叉树的字符串表达式计算方法 | |
JP4951416B2 (ja) | プログラム検証方法、プログラム検証装置 | |
Harmon et al. | Toward automated grammar extraction via semantic labeling of parser implementations | |
CN112230895A (zh) | 一种el表达式解析方法、装置、设备及存储介质 | |
CN116502140B (zh) | 一种基于控制流图相似性的加密算法识别方法及装置 | |
CN109325217A (zh) | 一种文件转换方法、系统、装置及计算机可读存储介质 | |
CN112507108B (zh) | 基于json规则文件的知识抽取方法、系统及规则解析引擎 | |
CN118427842B (zh) | 基于llm的sast漏洞快速分析方法、装置及设备 | |
US20240289102A1 (en) | Method and system for matching source code and binary code | |
US20240354078A1 (en) | Method for preprocessing code data for a subsequent evaluation | |
CN116560665B (zh) | 数据生成和处理的方法和装置、信用卡营销规则引擎系统 | |
KR102661819B1 (ko) | 시간적 관계정보의 컨텍스트 이해를 위한 오픈 도메인 정보 활용 방법 | |
Minamide et al. | Translating regular expression matching into transducers | |
Bottoni et al. | Deductive parsing of visual languages | |
Shukla | Converting Regex to Parsing Expression Grammar with Captures | |
Watson et al. | Lexical Analysis |
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 | ||
CB02 | Change of applicant information |
Address after: 361000 one of 504, No. 18, guanri Road, phase II, software park, Xiamen, Fujian Applicant after: XIAMEN YILIANZHONG YIHUI TECHNOLOGY CO.,LTD. Address before: Room 504, No.18, guanri Road, phase II, software park, Xiamen City, Fujian Province, 361000 Applicant before: XIAMEN YILIANZHONG YIHUI TECHNOLOGY CO.,LTD. |
|
CB02 | Change of applicant information | ||
GR01 | Patent grant | ||
GR01 | Patent grant |