表达式处理方法、装置、设备及计算机可读存储介质与流程

文档序号:15346424发布日期:2018-09-04 22:48阅读:138来源:国知局

本发明涉及计算机数据处理领域,尤其涉及一种表达式处理方法、装置、设备及计算机可读存储介质。



背景技术:

计算机程序是描述由计算机或基于处理器的设备执行的动作的指令列表。当计算机程序被加载并在计算机硬件上执行时,计算机将会跟随计算机程序的指令以预先确定的方式运转。在计算机程序中会使用大量的表达式,表达式(expression)是运算符(operator)和操作数(operand)所构成的序列,例如表达式可以“3+2”。在计算机执行表达式的过程中,计算机无法识别根据自然语言书写的表达式,因此需要对表达式进行相对应的格式转换以供计算机读取,但现有技术中对表达式的格式转换只能根据表达式的运算符以及操作数进行转换,从而导致转换后的表达式无法调用函数对象,导致了表达式无法实现复杂度较高的逻辑运算,且容易造成程序代码冗长、执行效率低下等问题。



技术实现要素:

本发明提供了一种表达式处理方法、装置、设备及计算机可读存储介质,旨在解决表达式在格式转换后无法调用函数对象的问题。

第一方面,本发明提供了一种表达式处理方法,其包括:

对表达式进行解析,以获取所述表达式中的表达式对象;

获取所述表达式对象的类型;

根据所述表达式对象的类型将所述表达式进行逆波兰转换,以生成逆波兰表达式;

执行所述逆波兰表达式以生成执行结果。

第二方面,本发明提供了一种表达式处理装置,其包括:

对象获取单元,用于对表达式进行解析,以获取所述表达式中的表达式对象;

类型获取单元,用于获取所述表达式对象的类型;

转换单元,用于根据所述表达式对象的类型将所述表达式进行逆波兰转换,以生成逆波兰表达式;

执行单元,用于执行所述逆波兰表达式以生成执行结果。

第三方面,本发明又提供了一种计算机设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现发明提供的任一项所述的表达式处理方法。

第四方面,本发明还提供了一种计算机可读存储介质,其中所述计算机可读存储介质存储有计算机程序,所述计算机程序包括程序指令,所述程序指令当被处理器执行时使所述处理器执行发明提供的任一项所述的表达式处理方法。

本发明提供一种表达式处理方法、装置、计算机设备及计算机可读存储介质。实施本发明实施例,通过对所述表达式进行解析以获取所述表达式对应以及表达式对应的类型,进而根据所述表达式对象的类型进行逆波兰转换,并执行所生成的逆波兰表达式以生成所述执行结果。优化了表达式的转换方式,解决了格式转换后无法调用函数对象的问题,提升了表达式的拓展性以及执行效率。

附图说明

为了更清楚地说明本发明实施例技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明一实施例提供的一种表达式处理方法的流程示意图;

图2为本发明一实施例提供的一种表达式处理方法的子流程示意图;

图3为本发明一实施例提供的一种表达式处理方法的子流程示意图;

图4为本发明一实施例提供的一种表达式处理方法的子流程示意图;

图5为本发明一实施例提供的一种表达式处理方法的子流程示意图;

图6为本发明一实施例提供的一种表达式处理装置的示意性框图;

图7为本发明一实施例提供的一种表达式处理装置中第一生成单元的示意性框图;

图8为本发明一实施例提供的一种表达式处理装置中类型获取单元的示意性框图;

图9为本发明一实施例提供的一种表达式处理装置中转换单元的示意性框图;

图10为本发明一实施例提供的一种表达式处理装置中第二处理单元的示意性框图;

图11为本发明一实施例提供的一种计算机设备的示意性框图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

应当理解,当在本说明书和所附权利要求书中使用时,术语“包括”和“包含”指示所描述特征、整体、步骤、操作、元素和/或组件的存在,但并不排除一个或一个以上其它特征、整体、步骤、操作、元素、组件和/或其集合的存在或添加。

还应当理解,在此本发明说明书中所使用的术语仅仅是出于描述特定实施例的目的而并不意在限制本发明。如在本发明说明书和所附权利要求书中所使用的那样,除非上下文清楚地指明其它情况,否则单数形式的“一”、“一个”及“该”意在包括复数形式。

请参照图1,其为本发明一实施例提供的一种表达式处理方法的流程示意图。该表达式处理方法可应用于服务器、台式电脑、手提电脑、平板电脑、个人数字助理(pda)、智能手机(如android手机、ios手机等)等终端中。具体地,该方法包括步骤s100-s400。

s100,对表达式进行解析,以获取所述表达式中的表达式对象。

具体地,所述表达式(expression)是运算符(operator)和操作数(operand)所构成的序列。表达式对象包括运算符对象、操作数对象。常见的运算符对象例如有算术运算符(例如+、-、×、÷等),关系运算符(例如<、<=、>、>=、==、!=等),以及逻辑运算符(例如&&、()、||、!等);常见的操作数对象例如有数字(1、23等)、变量(var、a等)。

所述对所述表达式进行解析可通过利用java等编程语言实现组合式解析器并通过该组合式解析器对表达式进行解析,以将所述表达式解析成为表达式对象。一个表达式可以包括一个或者多个类型的表达式对象,不同类型的表达式对象可通过不同的解析器进行解析得出。例如,通过常数解析器对字符串进行解析,可将该字符串中的常数生成相对应的表达式对象。

s200,获取所述表达式对象的类型。

具体请参照图2,其为本发明一实施例提供的一种表达式处理方法的子流程示意图。进一步地,步骤s200中的所述获取所述表达式对象的类型,包括步骤s210-s220。

s210,判断所述表达式对象是否包含预设的函数标记符。

具体地,所述函数标记符可以根据具体的表达式使用环境进行设置,例如该函数标记符可以为“$”、“¥”等等,本发明实施例并不对函数标记符的具体符号作出限制。所述函数标记符可设置于表达式对象的首字符前面。若表达式对象中包含该函数标记符,则判定所述表达式对象包含预设的函数标记符。

s220,若所述表达式对象包含预设的函数标记符,确定所述表达式对象为函数对象。

具体地,假设所述函数标记符为“$”,若所述表达式对象为“$startswith”,通过检测,可判定表达式对象“$startswith”中包含有预设的函数标记符“$”,则确定表达式对象“$startswith”为函数对象。

实施本发明实施例,通过在表达式中引入函数对象,并在函数对象中设置预设的函数标识符,极大地丰富了表达式的表现形式,提升了表达式的拓展性。通过函数对象直接引用该函数对象对操作数进行计算,减少了表达式的编写工作量,同时也提升了代码程序的运行效率。

s300,根据所述表达式对象的类型将所述表达式进行逆波兰转换,以生成逆波兰表达式。

具体请参照图3,其为本发明一实施例提供的一种表达式处理方法的子流程示意图。进一步地,步骤s300中的所述根据所述表达式对象的类型将所述表达式进行逆波兰转换,包括s310-s350。

s310,初始化预设的第一堆栈以及预设的第二堆栈。

具体地,所述预设的第一堆栈以及预设的第二堆栈用于存储逆波兰转换过程中的表达式对象。通过初始化该预设的第一堆栈以及预设的第二堆栈,以对栈内存留的数据进行清零,防止对逆波兰转换造成数据干扰。

s320,根据所述表达式对象的类型,对所述表达式对象进行压栈出栈操作。

具体请参照图4,其为本发明一实施例提供的一种表达式处理方法的子流程示意图。进一步地,步骤s320中的根据所述表达式对象的类型,对所述表达式对象进行压栈出栈操作,包括步骤s321-s326。

s321,若所述表达式对象为函数对象,获取所述函数对象对应的输入参数以及所述输入参数对应的入参数量。

具体地,所述获取所述函数对象对应的输入参数以及所述输入参数对应的入参数量可以包括:获取所述函数对象对应的参数起始符、参数结束符以及参数分隔符;根据参数起始符、参数结束符以及参数分隔符对所述输入参数进行分割,以得出所述函数对象对应的输入参数以及所述输入参数对应的入参数量。其中所述参数起始符可以为“(”,所述参数结束符可以为“)”,所述参数分割符可以为“,”。本发明实施例并不对所述参数起始符、参数结束符以及参数分隔符的具体符号作出限制。

假设该函数对象为:$average(a,b,c)。根据所述函数对象对应的参数起始符、参数结束符以及参数分隔符对该函数对象进行分割,所得出的输入参数为“a”、“b”、“c”;通过对所得出的输入参数进行计算,可得出所述输入参数对应的入参数量,函数对象$average(a,b,c)对应的入参数量为3个。

s322,对所述入参数量进行标记处理。

具体地,对所述入参数量进行标记处理具体可以为对该入参数量设置数量标识符,该标识符可以为“[]”。假设该入参数量为“3”,通过对所述入参数量进行标记处理后得出的入参数量为“[3]”。通过对入参数量进行标记处理,以防止所述入参数量在与所述函数对象合并后,对表达式的执行造成干扰。

s323,将标记后的入参数量与所述函数对象合并,以生成标记函数对象。

具体地,假设该函数对象为:$average(a,b,c),标记后的入参数量为[3]。则将标记后的入参数量与所述函数对象合并所生成标记函数对象为$average[3]。

s324,将所述标记函数对象压入所述第一堆栈。

具体地,对所述标记函数对象进行压栈操作,以将述标记函数对象压入所述第一堆栈。

s325,依次对所述输入参数进行解析,以获取所述输入参数的类型。

具体地,依次对所述输入参数进行解析具体为从左至右对所述输入参数进行解析。函数对象对应的输入参数可以是表达式或者操作数对象。例如假设该函数对象为$average(a,b,c+d),该函数对象对应的输入参数为“a”、“b”以及“c+d”。其中“a”以及“b”为操作数对象,“c+d”为表达式。

若所述输入参数为操作数对象,则获取到所述输入参数的类型为操作数对象本身。若所述输入参数为表达式,则将该表达式拆分为若干个的表达式对象后再进行解析,所获取到所述输入参数的类型为可以包括操作数对象或者运算符对象。例如,若该输入参数为“c+d”,对该输入参数进行拆分后,得出的表达式对象为“c”、“+”以及“d”,通过对“c”、“+”以及“d”进行解析,可得出输入参数“c+d”的类型包括运算符以及操作数。

s326,根据所述输入参数的类型对所述输入参数进行压栈出栈操作。

具体请参照图5,其为本发明一实施例提供的一种表达式处理方法的子流程示意图。进一步地,所述输入参数的类型包括操作数对象以及运算符对象,步骤s326中的所述根据所述输入参数的类型对所述输入参数进行压栈出栈操作,包括s3261-s3265。

s3261,若所述输入参数的类型为操作数对象,将所述操作数对象压入所述第二堆栈。

具体地,例如所述输入参数为操作数对象,例如为“a”、“b”等,则将所述操作数对象压入所述第二堆栈。

s3262,若所述输入参数的类型为运算符对象,获取所述运算符对象对应的第一优先级等级,以及获取位于所述第一堆栈中栈顶的运算符对象对应的第二优先级等级。

具体地,运算符对象之间可通过设定优先级等级,以进行复杂性较强的运算。例如运算符对象“*”的优先等级为3级,运算符对象“+”的优先等级为4级,级别数字越小,优先等级越高。

s3263,判断所述第一优先等级是否低于所述第二优先级等级。

具体地,假设第一优先等级为4级,所述第二优先级等级为3级,则可判定判断所述第一优先等级低于所述第二优先级等级。

s3264,若所述第一优先等级低于所述第二优先级等级,将所述位于所述第一堆栈中栈顶的运算符对象从所述第一堆栈中弹出并压入所述第二堆栈。

s3265,若所述第一优先等级高于所述第二优先级等级,将所述运算符对象压入所述第一堆栈。

具体的,通过对第一优先等级以及所述第二优先级等级的进行等级比较,并根据等级比较结果控制运算符对象的压栈顺序,以保证转换后逆波兰表达式的运算符优先级的正确性。

s330,判断所述表达式是否全部解析成功。

具体地,所述表达式的解析顺序可按照从左至右的顺序进行,若检测到最右端的表达式字符被解析成功,则判定所述表达式全部解析成功。

s340,若所述表达式已全部解析成功,将存储于所述第一堆栈的表达式对象压入所述第二堆栈。

具体地,将存储于所述第一堆栈的表达式对象压入所述第二堆栈具体为按照先进后出的顺序依次将第一堆栈中的表达式对象逐个弹出,并将从所述第一堆栈中逐个弹出的表达式对象依次压入所述第二堆栈。

s350,逆序弹出所述第二堆栈中的表达式对象,以生成所述逆波兰表达式。

具体地,所述逆序弹出所述第二堆栈中的表达式对象具体为按照先进先出的顺序依次弹出所述第二堆栈中的表达式对象。

s400,执行所述逆波兰表达式以生成执行结果。

具体地,所述执行所述逆波兰表达式以生成执行结果具体可以包括:

s410,初始化预设的第三堆栈,并依次从所述逆波兰表达式中获取所述表达式对象。

具体地,所述预设的第三堆栈用于存储逆波兰表达式的执行结果。依次从所述逆波兰表达式中获取所述表达式对象具体为根据从左至右的顺便依次送所述逆波兰表达式中获取所述表达式对象。

s420,根据所述表达式对象的类型进行压栈入栈操作。

具体地,所述表达式对象包括操作数对象、运算符对象以及函数对象。

(1)若所述表达式对象为操作数对象,将所述操作数对象压入所述第三堆栈。

(2)若所述表达式对象为运算符对象,从所述第三堆栈中弹出与所述运算符对象对应的操作数对象,根据所述操作数对象以及运算符对象进行计算,将所述执行结果压入所述第三堆栈。具体地,每一个运算符对象所对应的操作数对象为已知值,例如运算符对象“+”对应的操作数对象为2个。通过获取所述运算符对象对应的操作数对象的个数,从而确定需要从所述第三堆栈中弹出与所述运算符对象对应的操作数对象的个数。通过从所述第三堆栈中弹出的操作数对象以及所述运算符对象即可计算得出所述运算符对象对应的运算结果,然后将所计算得出的运算结果压入所述第三堆栈。

(3)若所述表达式对象为函数对象,从所述第三堆栈中弹出与所述函数对象对应的操作数对象,根据所述操作数对象以及函数对象进行计算,将所述执行结果压入所述第三堆栈。

具体地,由前述实施例可知,在所述表达式的逆波兰转换过程中已获取到所述函数对象中输入参数对应的入参数量,并将该入参数量进行标记处理后与所述函数对象合并,以生成标记函数对象。因此在执行所述逆波兰表达式时,通过获取所述标记函数对象对应的入参数量,即可确定需要从所述第三堆栈中弹出与所述函数对象对应的操作数对象的个数。

例如,假设该逆波兰表达式中的函数对象为$average[3],通过获取该函数对象对应的入参数量,可得出该函数对象对应的入参数量为3个,进而确定需要从所述第三堆栈中弹出与所述函数对象对应的操作数对象的个数为3个。

本发明实施例中,函数对象为$average[3]用于计算操作数对象的平均值。假设从所述第三堆栈中弹出的三个操作数对象分别为“a”、“b”以及“c”。根据所述函数对象的以及所述操作数对象,则可计算出所述“a”、“b”以及“c”的平均值,并将该平均值压入所述第三堆栈。

s430,判断所述逆波兰表达式的表达式对象是否全部被获取。

s440,若所述逆波兰表达式的表达式对象已全部被获取,则将最后一个压入所述第三堆栈的执行结果确定为所述逆波兰表达式的执行结果。

实施本发明实施例,通过对所述表达式进行解析以获取所述表达式对应以及表达式对应的类型,进而根据所述表达式对象的类型进行逆波兰转换,并执行所生成的逆波兰表达式以生成所述执行结果。可简化表达式的记录形式,有利于提高计算机系统对表达式的识别速度,提升了表达式的执行效率。

请参照图6,其为本发明一实施例提供的一种表达式处理装置的示意性框图。该表达式处理装置10包括对象获取单元100、类型获取单元200、转换单元300以及执行单元400。

对象获取单元100,用于对表达式进行解析,以获取所述表达式中的表达式对象。

具体地,所述表达式(expression)是运算符(operator)和操作数(operand)所构成的序列。表达式对象包括运算符对象、操作数对象。常见的运算符对象例如有算术运算符(例如+、-、×、÷等),关系运算符(例如<、<=、>、>=、==、!=等),以及逻辑运算符(例如&&、()、||、!等);常见的操作数对象例如有数字(1、23等)、变量(var、a等)。

所述对所述表达式进行解析可通过利用java等编程语言实现组合式解析器并通过该组合式解析器对表达式进行解析,以将所述表达式解析成为表达式对象。一个表达式可以包括一个或者多个类型的表达式对象,不同类型的表达式对象可通过不同的解析器进行解析得出。例如,通过常数解析器对字符串进行解析,可将该字符串中的常数生成相对应的表达式对象。

类型获取单元200,用于获取所述表达式对象的类型。

具体请参照图7,其为本发明一实施例提供的一种表达式处理装置中类型获取单元200的示意性框图。进一步地,所述类型获取单元200包括第一判断单元210以及第一处理单元220。

第一判断单元210,用于判断所述表达式对象是否包含预设的函数标记符。

具体地,所述函数标记符可以根据具体的表达式使用环境进行设置,例如该函数标记符可以为“$”、“¥”等等,本发明实施例并不对函数标记符的具体符号作出限制。所述函数标记符可设置于表达式对象的首字符前面。若表达式对象中包含该函数标记符,则判定所述表达式对象包含预设的函数标记符。

第一处理单元220,用于若所述表达式对象包含预设的函数标记符,确定所述表达式对象为函数对象。

具体地,假设所述函数标记符为“$”,若所述表达式对象为“$startswith”,通过检测,可判定表达式对象“$startswith”中包含有预设的函数标记符“$”,则确定表达式对象“$startswith”为函数对象。

实施本发明实施例,通过在表达式中引入函数对象,并在函数对象中设置预设的函数标识符,极大地丰富了表达式的表现形式,提升了表达式的拓展性。通过函数对象直接引用该函数对象对操作数进行计算,减少了表达式的编写工作量,同时也提升了代码程序的运行效率。

转换单元300,用于根据所述表达式对象的类型将所述表达式进行逆波兰转换,以生成逆波兰表达式。

具体请参照图8,其为本发明一实施例提供的一种表达式处理装置中转换单元300的示意性框图。进一步地,所述转换单元300包括初始化单元310、第二处理单元320、第二判断单元330、第三处理单元340以及第一生成单元350。

初始化单元310,用于预设的第一堆栈以及预设的第二堆栈。

具体地,所述预设的第一堆栈以及预设的第二堆栈用于存储逆波兰转换过程中的表达式对象。通过初始化该预设的第一堆栈以及预设的第二堆栈,以对栈内存留的数据进行清零,防止对逆波兰转换造成数据干扰。

第二处理单元320,用于根据所述表达式对象的类型,对所述表达式对象进行压栈出栈操作。

具体请参照图9,其为本发明一实施例提供的一种表达式处理装置中第二处理单元320的示意性框图。进一步地,所述第二处理单元320包括第一获取单元321、标记单元322、第二生成单元323、第四处理单元324、第二获取单元325以及第五处理单元326。

第一获取单元321,用于若所述表达式对象为函数对象,获取所述函数对象对应的输入参数以及所述输入参数对应的入参数量。

具体地,所述获取所述函数对象对应的输入参数以及所述输入参数对应的入参数量可以包括:获取所述函数对象对应的参数起始符、参数结束符以及参数分隔符;根据参数起始符、参数结束符以及参数分隔符对所述输入参数进行分割,以得出所述函数对象对应的输入参数以及所述输入参数对应的入参数量。其中所述参数起始符可以为“(”,所述参数结束符可以为“)”,所述参数分割符可以为“,”。本发明实施例并不对所述参数起始符、参数结束符以及参数分隔符的具体符号作出限制。

假设该函数对象为:$average(a,b,c)。根据所述函数对象对应的参数起始符、参数结束符以及参数分隔符对该函数对象进行分割,所得出的输入参数为“a”、“b”、“c”;通过对所得出的输入参数进行计算,可得出所述输入参数对应的入参数量,函数对象$average(a,b,c)对应的入参数量为3个。

标记单元322,用于对所述入参数量进行标记处理。

具体地,对所述入参数量进行标记处理具体可以为对该入参数量设置数量标识符,该标识符可以为“[]”。假设该入参数量为“3”,通过对所述入参数量进行标记处理后得出的入参数量为“[3]”。通过对入参数量进行标记处理,以防止所述入参数量在与所述函数对象合并后,对表达式的执行造成干扰。

第二生成单元323,用于将标记后的入参数量与所述函数对象合并,以生成标记函数对象。

具体地,假设该函数对象为:$average(a,b,c),标记后的入参数量为[3]。则将标记后的入参数量与所述函数对象合并所生成标记函数对象为$average[3]。

第四处理单元324,用于将所述标记函数对象压入所述第一堆栈。

具体地,对所述标记函数对象进行压栈操作,以将述标记函数对象压入所述第一堆栈。

第二获取单元325,用于次对所述输入参数进行解析,以获取所述输入参数的类型。

具体地,依次对所述输入参数进行解析具体为从左至右对所述输入参数进行解析。函数对象对应的输入参数可以是表达式或者操作数对象。例如假设该函数对象为$average(a,b,c+d),该函数对象对应的输入参数为“a”、“b”以及“c+d”。其中“a”以及“b”为操作数对象,“c+d”为表达式。

若所述输入参数为操作数对象,则获取到所述输入参数的类型为操作数对象本身。若所述输入参数为表达式,则将该表达式拆分为若干个的表达式对象后再进行解析,所获取到所述输入参数的类型为可以包括操作数对象或者运算符对象。例如,若该输入参数为“c+d”,对该输入参数进行拆分后,得出的表达式对象为“c”、“+”以及“d”,通过对“c”、“+”以及“d”进行解析,可得出输入参数“c+d”的类型包括运算符以及操作数。

第五处理单元326,用于根据所述输入参数的类型对所述输入参数进行压栈出栈操作。

具体请参照图10,其为本发明一实施例提供的一种表达式处理装置中第五处理单元326的示意性框图。进一步地,所述输入参数的类型包括操作数对象以及运算符对象,所述第五处理单元326包括第六处理单元3261、第三获取单元3262、第三判断单元3263、第七处理单元3264以及第八处理单元3265。

第六处理单元3261,用于若所述输入参数的类型为操作数对象,将所述操作数对象压入所述第二堆栈。

具体地,例如所述输入参数为操作数对象,例如为“a”、“b”等,则将所述操作数对象压入所述第二堆栈。

第三获取单元3262,用于若所述输入参数的类型为运算符对象,获取所述运算符对象对应的第一优先级等级,以及获取位于所述第一堆栈中栈顶的运算符对象对应的第二优先级等级。

具体地,运算符对象之间可通过设定优先级等级,以进行复杂性较强的运算。例如运算符对象“*”的优先等级为3级,运算符对象“+”的优先等级为4级,级别数字越小,优先等级越高。

第三判断单元3263,用于判断所述第一优先等级是否低于所述第二优先级等级。

具体地,假设第一优先等级为4级,所述第二优先级等级为3级,则可判定判断所述第一优先等级低于所述第二优先级等级。

第七处理单元3264,用于若所述第一优先等级低于所述第二优先级等级,将所述位于所述第一堆栈中栈顶的运算符对象从所述第一堆栈中弹出并压入所述第二堆栈。

第八处理单元3265,用于若所述第一优先等级高于所述第二优先级等级,将所述运算符对象压入所述第一堆栈。

具体的,通过对第一优先等级以及所述第二优先级等级的进行等级比较,并根据等级比较结果控制运算符对象的压栈顺序,以保证转换后逆波兰表达式的运算符优先级的正确性。

第二判断单元330,用于判断所述表达式是否全部解析成功。

具体地,所述表达式的解析顺序可按照从左至右的顺序进行,若检测到最右端的表达式字符被解析成功,则判定所述表达式全部解析成功。

第三处理单元340,用于若所述表达式已全部解析成功,将存储于所述第一堆栈的表达式对象压入所述第二堆栈。

具体地,将存储于所述第一堆栈的表达式对象压入所述第二堆栈具体为按照先进后出的顺序依次将第一堆栈中的表达式对象逐个弹出,并将从所述第一堆栈中逐个弹出的表达式对象依次压入所述第二堆栈。

第一生成单元350,用于逆序弹出所述第二堆栈中的表达式对象,以生成所述逆波兰表达式。

具体地,所述逆序弹出所述第二堆栈中的表达式对象具体为按照先进先出的顺序依次弹出所述第二堆栈中的表达式对象。

执行单元400,用于执行所述逆波兰表达式以生成执行结果。

具体地,所述生成单元包括堆栈初始化单元310、压栈操作单元、表达式判断单元以及结果确定单元。

堆栈初始化单元310,用于初始化预设的第三堆栈,并依次从所述逆波兰表达式中获取所述表达式对象。

具体地,所述预设的第三堆栈用于存储逆波兰表达式的执行结果。依次从所述逆波兰表达式中获取所述表达式对象具体为根据从左至右的顺便依次送所述逆波兰表达式中获取所述表达式对象。

压栈操作单元,用于根据所述表达式对象的类型进行压栈入栈操作。

具体地,所述表达式对象包括操作数对象、运算符对象以及函数对象。

(1)若所述表达式对象为操作数对象,将所述操作数对象压入所述第三堆栈。

(2)若所述表达式对象为运算符对象,从所述第三堆栈中弹出与所述运算符对象对应的操作数对象,根据所述操作数对象以及运算符对象进行计算,将所述执行结果压入所述第三堆栈。具体地,每一个运算符对象所对应的操作数对象为已知值,例如运算符对象“+”对应的操作数对象为2个。通过获取所述运算符对象对应的操作数对象的个数,从而确定需要从所述第三堆栈中弹出与所述运算符对象对应的操作数对象的个数。通过从所述第三堆栈中弹出的操作数对象以及所述运算符对象即可计算得出所述运算符对象对应的运算结果,然后将所计算得出的运算结果压入所述第三堆栈。

(3)若所述表达式对象为函数对象,从所述第三堆栈中弹出与所述函数对象对应的操作数对象,根据所述操作数对象以及函数对象进行计算,将所述执行结果压入所述第三堆栈。

具体地,由前述实施例可知,在所述表达式的逆波兰转换过程中已获取到所述函数对象中输入参数对应的入参数量,并将该入参数量进行标记处理后与所述函数对象合并,以生成标记函数对象。因此在执行所述逆波兰表达式时,通过获取所述标记函数对象对应的入参数量,即可确定需要从所述第三堆栈中弹出与所述函数对象对应的操作数对象的个数。

例如,假设该逆波兰表达式中的函数对象为$average[3],通过获取该函数对象对应的入参数量,可得出该函数对象对应的入参数量为3个,进而确定需要从所述第三堆栈中弹出与所述函数对象对应的操作数对象的个数为3个。

本发明实施例中,函数对象为$average[3]用于计算操作数对象的平均值。假设从所述第三堆栈中弹出的三个操作数对象分别为“a”、“b”以及“c”。根据所述函数对象的以及所述操作数对象,则可计算出所述“a”、“b”以及“c”的平均值,并将该平均值压入所述第三堆栈。

表达式判断单元,用于判断所述逆波兰表达式的表达式对象是否全部被获取。

结果确定单元,用于若所述逆波兰表达式的表达式对象已全部被获取,则将最后一个压入所述第三堆栈的执行结果确定为所述逆波兰表达式的执行结果。

实施本发明实施例,通过对所述表达式进行解析以获取所述表达式对应以及表达式对应的类型,进而根据所述表达式对象的类型进行逆波兰转换,并执行所生成的逆波兰表达式以生成所述执行结果。可简化表达式的记录形式,有利于提高计算机系统对表达式的识别速度,提升了表达式的执行效率。

上述装置10可以实现为一种计算机程序的形式,计算机程序可以在如图11所示的计算机设备上运行。

请参阅图11,图11是本发明实施例提供的一种计算机设备的示意性框图。该计算机设备500设备可以是终端。该终端可以是智能手机、平板电脑、笔记本电脑、台式电脑、个人数字助理和穿戴式设备等具有通信功能的电子设备。

该计算机设备500包括通过系统总线510连接的处理器520、存储器和网络接口550,其中,存储器可以包括非易失性存储介质530和内存储器540。

该非易失性存储介质530可存储操作系统531和计算机程序532。该计算机程序532被执行时,可使得处理器520执行一种接口自动化测试方法。

该处理器520用于提供计算和控制能力,支撑整个计算机设备500的运行。

该内存储器540为非易失性存储介质中的计算机程序的运行提供环境,该计算机程序被处理器520执行时,可使得处理器520执行一种接口自动化测试方法。

该网络接口550用于进行网络通信,如发送分配的任务等。本领域技术人员可以理解,该计算机设备的示意性框图仅仅是与本发明方案相关的部分结构的框图,并不构成对本发明方案所应用于其上的计算机设备500的限定,具体的计算机设备500可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

其中,所述处理器520用于运行存储在存储器中的程序代码,以实现如下功能:

对表达式进行解析,以获取所述表达式中的表达式对象;

获取所述表达式对象的类型;

根据所述表达式对象的类型将所述表达式进行逆波兰转换,以生成逆波兰表达式;

执行所述逆波兰表达式以生成执行结果。

在一实施例中,处理器520在执行所述获取所述表达式对象的类型的步骤时,具体执行如下步骤:

判断所述表达式对象是否包含预设的函数标记符;

若所述表达式对象包含预设的函数标记符,确定所述表达式对象为函数对象。

在一实施例中,处理器520在执行所述根据所述表达式对象的类型将所述表达式进行逆波兰转换的步时,具体执行如下步骤:

初始化预设的第一堆栈以及预设的第二堆栈;

根据所述表达式对象的类型,对所述表达式对象进行压栈出栈操作;

判断所述表达式是否全部解析成功;

若所述表达式已全部解析成功,将存储于所述第一堆栈的表达式对象压入所述第二堆栈;

逆序弹出所述第二堆栈中的表达式对象,以生成所述逆波兰表达式。

在一实施例中,处理器520在执行所述将所述根据所述表达式对象的类型,对所述表达式对象进行压栈出栈操作的步骤时,具体执行如下步骤:

若所述表达式对象为函数对象,获取所述函数对象对应的输入参数以及所述输入参数对应的入参数量;

对所述入参数量进行标记处理;

将标记后的入参数量与所述函数对象合并,以生成标记函数对象;

将所述标记函数对象压入所述第一堆栈;

依次对所述输入参数进行解析,以获取所述输入参数的类型;

根据所述输入参数的类型对所述输入参数进行压栈出栈操作。

在一实施例中,所述输入参数的类型包括操作数对象以及运算符对象,处理器520在执行根据所述输入参数的类型对所述输入参数进行压栈出栈操作的步骤时,具体执行如下步骤:

若所述输入参数的类型为操作数对象,将所述操作数对象压入所述第二堆栈;

若所述输入参数的类型为运算符对象,获取所述运算符对象对应的第一优先级等级,以及获取位于所述第一堆栈中栈顶的运算符对象对应的第二优先级等级;

判断所述第一优先等级是否低于所述第二优先级等级;

若所述第一优先等级低于所述第二优先级等级,将所述位于所述第一堆栈中栈顶的运算符对象从所述第一堆栈中弹出并压入所述第二堆栈;

若所述第一优先等级高于所述第二优先级等级,将所述运算符对象压入所述第一堆栈。

应当理解,在本发明实施例中,处理器520可以是中央处理单元(centralprocessingunit,cpu),该处理器520还可以是其他通用处理器、数字信号处理器(digitalsignalprocessor,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)、现成可编程门阵列(field-programmablegatearray,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。其中,通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。

本领域技术人员可以理解,该计算机设备500的示意性框图并不构成对计算机设备500的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。

在本发明的另一实施例中提供一种计算机可读存储介质,该计算机可读存储介质存储有计算机程序,其中计算机程序包括程序指令。所述程序指令被处理器执行时实现如下步骤:

对表达式进行解析,以获取所述表达式中的表达式对象;

获取所述表达式对象的类型;

根据所述表达式对象的类型将所述表达式进行逆波兰转换,以生成逆波兰表达式;

执行所述逆波兰表达式以生成执行结果。

在一实施例中,所述程序指令被处理器执行以实现所述获取所述表达式对象的类型的步骤时,具体实现如下步骤:

判断所述表达式对象是否包含预设的函数标记符;

若所述表达式对象包含预设的函数标记符,确定所述表达式对象为函数对象。

在一实施例中,所述程序指令被处理器执行以实现所述根据所述表达式对象的类型将所述表达式进行逆波兰转换的步时,具体实现如下步骤:

初始化预设的第一堆栈以及预设的第二堆栈;

根据所述表达式对象的类型,对所述表达式对象进行压栈出栈操作;

判断所述表达式是否全部解析成功;

若所述表达式已全部解析成功,将存储于所述第一堆栈的表达式对象压入所述第二堆栈;

逆序弹出所述第二堆栈中的表达式对象,以生成所述逆波兰表达式。

在一实施例中,所述程序指令被处理器执行以实现所述根据所述表达式对象的类型,对所述表达式对象进行压栈出栈操作的步骤时,具体实现如下步骤:

若所述表达式对象为函数对象,获取所述函数对象对应的输入参数以及所述输入参数对应的入参数量;

对所述入参数量进行标记处理;

将标记后的入参数量与所述函数对象合并,以生成标记函数对象;

将所述标记函数对象压入所述第一堆栈;

依次对所述输入参数进行解析,以获取所述输入参数的类型;

根据所述输入参数的类型对所述输入参数进行压栈出栈操作。

在一实施例中,所述输入参数的类型包括操作数对象以及运算符对象,所述程序指令被处理器执行以实现所述根据所述输入参数的类型对所述输入参数进行压栈出栈操作的步骤时,具体实现如下步骤:

若所述输入参数的类型为操作数对象,将所述操作数对象压入所述第二堆栈;

若所述输入参数的类型为运算符对象,获取所述运算符对象对应的第一优先级等级,以及获取位于所述第一堆栈中栈顶的运算符对象对应的第二优先级等级;

判断所述第一优先等级是否低于所述第二优先级等级;

若所述第一优先等级低于所述第二优先级等级,将所述位于所述第一堆栈中栈顶的运算符对象从所述第一堆栈中弹出并压入所述第二堆栈;

若所述第一优先等级高于所述第二优先级等级,将所述运算符对象压入所述第一堆栈。

该计算机可读存储介质可以是u盘、移动硬盘、只读存储器(rom,read-onlymemory)、磁碟或者光盘等各种可以存储程序代码的介质。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,上述描述的装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在本发明所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的。例如,各个单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。例如一个以上单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。

本发明实施例方法中的步骤可以根据实际需要进行顺序调整、合并和删减。本发明实施例装置中的单元可以根据实际需要进行合并、划分和删减。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以是两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

该集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分,或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,终端,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1