首页> 中国专利> 一种函数解析方法及其计算机设备

一种函数解析方法及其计算机设备

摘要

本申请公开了一种函数解析方法,包括:对函数的表达式进行解析,得到函数参数;确定函数参数是否为引用参数;响应于函数参数为引用参数,将函数对应的引用索引添加到引用参数对应的被引用函数的依赖列表中,以建立被引用函数优先于函数进行计算的优先级关系。通过上述方式,本申请能够实现对函数参数是其他函数表达式结果的函数的解析。

著录项

  • 公开/公告号CN112799671A

    专利类型发明专利

  • 公开/公告日2021-05-14

    原文格式PDF

  • 申请/专利权人 北京配天技术有限公司;

    申请/专利号CN201911107908.1

  • 发明设计人 许贝贝;

    申请日2019-11-13

  • 分类号G06F8/41(20180101);

  • 代理机构44280 深圳市威世博知识产权代理事务所(普通合伙);

  • 代理人唐双

  • 地址 100085 北京市海淀区东北旺西路8号9号楼3区103

  • 入库时间 2023-06-19 10:58:46

说明书

技术领域

本申请涉及计算机领域,特别是涉及一种函数解析方法及其计算机设备。

背景技术

较早前的基于调度场算法实现的函数解析器,是以操作数和操作符作为基本的元素,无法支持对内嵌函数表达式的解析。通过对该算法进行扩展,已经可以支持对内嵌函数表达式的解析,且解决了函数参数解析的问题,即可以确定哪些参数属于该函数。

在以前的函数解析中,对于功能相同,参数个数不同的函数,需要提供不同的函数名,这违背函数名称的统一性原则,也使得用户对函数的使用缺乏灵活性。通过对该算法的进一步扩展,现已提出了一种变参函数边界确定的方法,能够很好的解决基于同一函数名时实参个数无法确定的问题,从而实现了函数解析器对变参函数的支持。

尽管如此,目前的函数解析器中仍然一些问题,比如,内嵌函数的函数参数的取值限定为常量参数、字符参数、字符串参数,只能完成各个函数独立的功能。但是对于某个函数的实现是依赖于另外一个函数的情况,则无法通过函数的表达式来进行组织,从而无法实现对函数参数是其他函数表达式结果的函数的解析。

发明内容

本申请主要解决的技术问题是提供一种函数解析方法及其计算机设备,能够实现对函数参数是其他函数表达式结果的函数的解析。

为解决上述技术问题,本申请采用的一个技术方案是:提供一种函数解析方法,包括:对函数的表达式进行解析,得到函数参数;确定函数参数是否为引用参数;响应于函数参数为引用参数,将函数对应的引用索引添加到引用参数对应的被引用函数的依赖列表中,以建立被引用函数优先于函数进行计算的优先级关系。

其中,对函数的表达式进行解析的步骤之前包括:在具有函数的更新列表中填入函数的表达式,其中若函数的表达式中具有引用参数,则建立函数与被引用函数之间的引用关系。

其中,引用参数是被引用函数的表达式在更新列表中的位置编号;引用索引是函数的表达式在更新列表中的位置编号。

其中,将函数对应的引用索引添加到引用参数对应的被引用函数的依赖列表中的步骤后包括:确定被引用函数的表达式是否更新;响应于被引用函数的表达式更新,重新计算被引用函数的表达式并更新其计算结果。

其中,响应于被引用函数的表达式更新,重新计算被引用函数的表达式并更新其计算结果的步骤后包括:遍历被引用函数的依赖列表,更新在被引用函数之后进行计算的所有函数的表达式及其计算结果。

其中,更新列表为电子表格,列表中的位置编号为电子表格的序号。

其中,确定函数参数是否为引用参数的步骤后包括:响应于函数参数中不为引用参数,将函数参数放入函数参数列表中。

其中,响应于函数参数为引用参数,将函数对应的引用索引添加到引用参数对应的被引用函数的依赖列表中的步骤后包括:将函数参数放入函数参数列表中。

其中,将函数参数放入函数参数列表的步骤后包括:确定函数参数遍历是否完成;响应于函数参数遍历未完成,返回对函数的表达式进行解析,得到函数参数的步骤。

为解决上述技术问题,本申请采用的另一个技术方案是:提供一种计算机设备,包括处理器、存储器及其存储的指令,处理器执行指令时实现如上述任一项方法的步骤。

本申请的有益效果是:区别于现有技术的情况,本申请通过引用参数来代替被引用函数的表达式,使得函数的表达式可以组织;确定函数参数为引用参数,将函数对应的引用索引添加到引用参数对应的被引用函数的依赖列表中,以建立被引用函数优先于函数进行计算的优先级关系,从而可以实现对函数参数是其他函数表达式结果的函数的解析。

附图说明

图1是本申请函数解析方法一实施例的流程示意图;

图2是本申请函数解析方法一实施例中依赖列表的示意图;

图3是本申请函数解析方法一实施例中参数列表的示意图;

图4是本申请函数解析方法另一实施例的流程示意图;

图5是本申请函数解析方法另一实施例中填入函数的表达式之前更新列表的示意图;

图6是本申请函数解析方法另一实施例中填入函数的表达式之后更新列表的示意图;

图7是本申请函数解析方法另一实施例中被引用函数的两种不同更新方式的示意图。

图8是本申请计算机设备一实施例的结构示意图。

具体实施方式

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

在计算机科学领域,调度场算法(Shunting Yard Algorithm)是一个用于解析数学表达式的方法,尤其是中缀表达式。具体地,调度场算法用于将中缀表达式转换为后缀表达式或者生成代码树(AST),并得到各个运算符的关系。其中,中缀表达式是以操作数和操作符作为基本的元素,是一个通用的算术或逻辑公式表示方法,操作符是以中缀形式处于操作数的中间。后缀表达式的操作符以后缀形式处于操作数之后。例如,普通表达式(中缀表达式):a+b-c*d,操作数为a、b、c、d,操作符为+、-、*,其后缀表达式为a b c d*-+。

通过对该算法进行扩展,已经可以支持对内嵌函数表达式的解析,且解决了函数参数解析的问题,即可以确定哪些参数属于该函数。但是,内嵌函数的函数参数的取值限定为常量参数、字符参数、字符串参数。

例如,内嵌函数的表达式:

FuncA(a1,a2)+FuncB(b1,b2)-FuncC(c1,c2),

其中函数FuncA的函数参数为a1、a2,函数FuncB的函数参数为b1、b2,函数FuncC的函数参数为c1、c2。a1、a2、b1、b2、c1、c2取值限定为常量参数、字符参数、字符串参数。

随着对算法的进一步扩展,实现了函数解析器对变参函数的支持。对于功能相同,参数个数不同的函数,需要提供不同的函数名,这违背函数名称的统一性原则,也使得用户对函数的使用缺乏灵活性。现已经提出了一种变参函数边界确定的方法,能够很好的解决基于同一函数名时实参个数无法确定的问题,从而实现了函数解析器对变参函数的支持。例如,内嵌可变参数函数的表达式:

VarFuncA(a1,a2)+VarFuncA(a3,a4,a5),

其中,a1、a2、a3、a4、a5取值限定为常量参数、字符参数、字符串参数。

图1示出了本申请函数解析方法一实施例的流程示意图。参阅图1,本申请实施例中的函数解析方法包括步骤:

S11:对函数的表达式进行解析,得到函数参数。

其中,函数参数包括引用参数和其他参数。

引用参数代表对应的被引用函数的表达式,以使得函数的表达式可以组织。在函数的计算过程中,可以通过引用参数调用被引用函数的表达式的结果,以继续进行函数的表达式的计算。如果直接将被引用函数的表达式填入函数的表达式中,会使得函数的表达式不能组织,从而无法正常解析以及在函数的表达式在计算的过程中,不能调用关联的被引用函数的表达式的结果。其他参数是除引用参数之外的参数。其他参数可以为常量参数、字符参数或字符串参数。

本申请通过引入引用参数,使得函数的表达式可以进行组织,实现了函数之间的依赖关系的建立。

例如,对函数的表达式FuncB(index_FuncA,b1,b2)进行解析,得到函数参数index_FuncA。其中,index_FuncA为引用参数。引用参数index_FuncA对应的被引用函数的表达式为FuncA(a1,a2),其中,a1、a2为常量参数、字符参数或字符串参数。

又例如,一函数表达式为FuncB(index_FuncA,b1,b2)+FuncC(index_FuncA,c1),

需要注意的是,函数表达式与函数的表达式不同,函数的表达式可以是函数表达式,也可以只是函数表达式中的其中一个函数的表达式。对函数的表达式FuncB(index_FuncA,b1,b2)进行解析,得到函数参数index_FuncA。其中,index_FuncA为引用参数。引用参数index_FuncA对应的被引用函数的表达式为FuncA(a1,a2),其中,a1、a2为常量参数、字符参数或字符串参数。

S12:确定函数参数是否为引用参数。

例如,确定函数参数index_FuncA是否为引用参数。

其中,可以通过一串代表引用参数的字符串,作为引用参数的识别标记。例如,“index_”。还可以通过字符加数字的组合形式,作为引用参数的识别标记。例如,“A1”、“B3”、“E5”。本实施例中,不对确定引用参数命名方式做具体限制,只要能够在解析过程中确定出引用参数即可。

S13:响应于函数参数为引用参数,将函数对应的引用索引添加到引用参数对应的被引用函数的依赖列表中,以建立被引用函数优先于函数进行计算的优先级关系。

通过上述方式,建立的被引用函数优先于函数进行计算的优先级关系,可以使得在后续的函数计算过程中优先计算被引用函数,从而可以将被引用函数的结果用于函数的计算。

其中,依赖列表是一个存放被引用函数与所有引用该被引用函数的优先级关系的列表。一般地,依赖列表具有行和列。以列为依据,可以是从前往后,前一列函数的优先级高于后一列函数的优先级。以行为依据,可以是从前往后,前一行函数的优先级高于后一行函数的优先级。此外,只要能够建立函数与被引用函数的优先级关系即可,具体方式不做限制。可选地,依赖列表可以是电子表格。

例如,如果判断函数参数index_FuncA为引用参数,则将函数FuncB对应的引用索引添加到引用参数index_FuncA对应的被引用函数FuncA的依赖列表中,以建立被引用函数FuncA优先于函数FuncB进行计算的优先级关系。在后续的函数FuncB计算过程中,可以优先计算被引用函数FuncA,从而能够将被引用函数FuncA的结果用于函数FuncB的计算。

例如,参见图2,图2是本申请函数解析方法一实施例中依赖列表的示意图。函数FuncA的依赖列表sheet2中,存放了被引用函数FuncA与所有引用该被引用函数的函数(如FuncB、FuncC和FuncD)的优先级关系。其中,FuncB函数的引用索引为sheet1!C3,FuncC函数的引用索引为sheet1!C4,FuncD函数的引用索引为sheet1!C5,sheet1!C3、sheet1!C4和sheet1!C5与FuncA在依赖列表sheet2中的位置关系如图2所示。其中,A列中函数的优先级高于B列中各个引用索引对应的函数的优先级,以建立被引用函数优先于函数进行计算的优先级关系。

区别于相关技术,本申请通过引用参数来代替被引用函数的表达式,使得函数的表达式可以组织;确定函数参数为引用参数,将函数对应的引用索引添加到引用参数对应的被引用函数的依赖列表中,以建立被引用函数优先于函数进行计算的优先级关系,从而可以实现对函数参数是其他函数表达式结果的函数的解析。

继续参阅图1,本申请实施例中的函数解析方法进一步包括:

在步骤S12:确定函数参数是否为引用参数之后还包括:

响应于函数参数不为引用参数,执行步骤S14。

具体地,如果函数参数不为引用参数,则执行步骤S14。

例如,b1为常量参数、字符参数或字符串参数。当解析出的函数参数为b1时,则执行步骤S14。

S14:将函数参数放入函数参数列表中。

参数列表是指存放该函数的函数参数的列表。其中,函数参数列表可以是电子表格。

例如,参见图3,图3是本申请函数解析方法一实施例中参数列表的示意图。当函数参数为引用参数index_FuncA时,将index_FuncA放入函数FuncB的参数列表sheet3中;当函数参数不为引用参数时,将函数参数b1或b2放入函数FuncB的参数列表sheet3中。

S15:确定函数参数遍历是否完成。

例如,判断函数FuncB的函数参数index_FuncA、b1和b2是否全部解析完成,其中可以通过判断是否解析到该函数的表达式中右括号“)”,来确定函数参数遍历是否完成。

响应于函数参数遍历未完成,返回步骤S11,继续解析函数的下一个函数参数。

响应于函数参数遍历完成,函数解析完成。

在完成函数的解析后,可以继续对函数表达式中的其他函数的表达式进行解析,直到函数表达式的解析完成。

例如,当解析过程中没有发现右括号“)”,则认为函数参数遍历未完成,否则,则认为函数参数遍历完成。在完成函数FuncB的解析后,会继续对函数表达式中的其他函数的表达式进行解析,例如FuncC(index_FuncA,c1),直到函数表达式的解析完成。

本申请通过将函数参数放入函数参数列表中,以得到该函数解析出的所有函数参数,通过确定函数参数遍历是否完成来判断函数的解析是否完成。

图4示出了本申请函数解析方法另一实施例的流程示意图。参阅图4,本申请实施例中的函数解析方法包括步骤:

S21:在具有函数的更新列表中填入函数的表达式,其中若函数的表达式为引用参数,则建立函数与被引用函数之间的引用关系。

其中,在函数的表达式中引入引用参数,一方面使得函数的表达式可以组织,以便于对函数的解析,另一方面是在函数在计算过程中可以调用被引用函数的结果。

例如,函数的表达式为FuncB(index_FuncA,b1,b2),在具有函数FuncB的更新列表中填入函数的表达式FuncB(index_FuncA,b1,b2),其中函数的表达式中具有引用参数index_FuncA,可以建立函数FuncB与被引用函数FuncA之间的引用关系。

可选地,引用参数是被引用函数的表达式在更新列表中的位置编号。其中,每个位置编号是唯一的。位置编号可以为字符、字符串或者字符、数字、字符串中至少两种的组合。一般地,更新列表具有行和列,从而可以为更新列表的行列设置位置编号,使得更新列表中的被引用函数的表达式所在的位置也具有位置编号,且位置编号唯一。如果更新列表本身具有唯一的位置标号,则可免去设置位置编号的步骤。

例如,当列表为一行多列时,位置编号可以为字符A,其中,A可以为其中某列的位置编号;当列表为多行一列时,位置编号可以为字符A,其中,A可以为其中某行的位置编号;当列表为多行多列时,位置编号可以为字符串AB,其中A为行的位置编号,B为列的位置编号。位置编号还可以根据实际需要进行定义。

可选地,更新列表可以为电子表格。更新列表中的位置编号为电子表格的序号。通过将电子表格作为函数的更新列表,可以简化自定义函数编号的过程。

例如,参见图5,图5本申请函数解析方法另一实施例中填入函数的表达式之前更新列表的示意图。在未填入函数的表达式之前更新列表sheet1中已经存在被引用函数的表达式FuncA(a1,a2)。被引用函数的表达式FuncA(a1,a2)所在的单元格位于第3行,第B列,则位置编号为B3。

参见图6,图6本申请函数解析方法另一实施例中填入函数的表达式之后更新列表的示意图。在填入函数的表达式FuncB(sheet1!B3,b1,b2)之后,更新列表sheet1中的函数的表达式FuncB(sheet1!B3,b1,b2)所在的单元格位于第3行,第C列,则位置编号为sheet1!C3。

其中,更新列表可以是一个单独的列表,也是多个列表的组合而成的列表。

例如,当更新列表为sheet1和sheet2的组合时,被引用函数的表达式FuncA(a1,a2)位于电子表格sheet1时,其所在的单元格位于第3行,第B列,则位置编号为sheet1!B3;函数的表达式FuncB(sheet1!B3,b1,b2),位于电子表格sheet2时,其所在的单元格位于第3行,第C列,则位置编号为sheet2!C3。

S22:对函数的表达式进行解析,得到函数参数。

本实施例中,对于该步骤的阐述可以参照函数解析方法一实施例中相应位置的阐述,此处不再赘述。

S23:确定函数参数是否为引用参数。

本实施例中,对于该步骤的阐述可以参照函数解析方法一实施例中相应位置的阐述,此处不再赘述。

S24:响应于函数参数为引用参数,将函数对应的引用索引添加到引用参数对应的被引用函数的依赖列表中,以建立被引用函数优先于函数进行计算的优先级关系。

其中,引用索引是函数的表达式在更新列表中的位置编号。

例如,参见图2和图6,函数的表达式为FuncB(sheet1!B3,b1,b2),函数的表达式所在的位置编号为sheet1!C3。将sheet1!C3作为FuncB(sheet1!B3,b1,b2)对应的引用索引,添加到引用参数sheet1!B3对应的被引用函数FuncA的依赖列表中。其中,依赖列表为不同于更新列表的列表。可选地,依赖列表也可以为电子表格。

响应于函数参数不为引用参数,执行步骤S26。

本实施例中,对于该步骤的阐述可以参照函数解析方法一实施例中相应位置的阐述,此处不再赘述。

S26:确定函数参数遍历是否完成。

响应于函数参数遍历未完成,返回步骤S22,继续解析函数的下一个参数。

响应于函数参数遍历完成,执行步骤S27。

本实施例中,对于该步骤的阐述可以参照函数解析方法一实施例中相应位置的阐述,此处不再赘述。

S27:确定被引用函数的表达式是否更新。

S28:响应于被引用函数的表达式更新,重新计算被引用函数的表达式并更新其计算结果。

响应于被引用函数的表达式未更新,函数的解析完成。

S29:遍历被引用函数的依赖列表,更新在被引用函数之后进行计算的所有函数的表达式及其计算结果。

在函数的表达式的计算过程中,可以通过引用参数找到对应的被引用函数的表达式,并直接将被引用函数的表达式的计算结果返回函数的表达式的计算,以实现函数的表达式的计算是依赖另一个函数表达式的结果的情况。所以在被引用函数的表达式发生变化时需要对其结果进行更新,以使计算函数的表达式过程中能够调用正确的被引用函数的结果。

如果函数的表达式具有多层引用关系,则在对其进行计算时,可由内向外依次根据被引用函数的依赖列表,对相应函数进行更新,以实现最外层函数的更新。

例如,函数的表达式FuncC(sheet1!C3,c1,c2)、FuncB(sheet1!B3,b1,b2)、FuncA(a1,a2),其中,函数FuncC引用函数FuncB的结果,函数FuncB引用函数FuncA的结果,FuncC为最外层函数。当对函数FuncC进行解析时,将函数FuncC的引用索引sheet1!C3添加到函数FuncB的依赖列表里。当对函数FuncB进行解析时,将函数FuncB的引用索引sheet1!B3添加到函数FuncA的依赖列表里。当对函数的表达式FuncC(sheet1!C3,c1,c2)进行计算时,先通过sheet1!C3找到FuncB(sheet1!B3,b1,b2),根据FuncB的依赖列表判断出FuncB优先于FuncA进行计算,继续通过sheet1!B3找到FuncA(a1,a2),根据FuncA的依赖列表判断出FuncA优先于FuncB进行计算,由此可实现先对FuncA进行计算,再将FuncA的计算结果返回计算FuncB,得到FuncB的计算结果,然后将FuncB的计算结果返回计算FuncC,得到FuncC的计算结果。当FuncA更新时,可以依次实现FuncB和FuncC的更新,由此可以实现对函数由内向外的进行更新,以得到正确的计算结果。

更新过程是在更新列表中,可以按照先行后列,同一行按优先级顺序执行计算的规则进行更新。具体上,按照先行后列,先对第一行按优先级顺序执行计算的规则进行更新,然后对第一列按优先级顺序执行计算的规则进行更新。

例如,参见图6,被引用函数的表达式为FuncA(a1,a2)所在的位置编号为sheet1!B3,函数的表达式为FuncB(sheet1!B3,b1,b2)所在的位置编号为sheet1!C3,即是表达式FuncA(a1,a2)和FuncB(sheet1!B3,b1,b2)都是位于第三行,按优先级FuncA高于FuncB的顺序,先对FuncA(a1,a2)进行计算,再对FuncB(sheet1!B3,b1,b2)进行计算。

其中,被引用函数的表达式的更新可以为函数参数数值的更新,也可以为函数参数个数的更新。

例如,参见图7,图7是本申请函数解析方法另一实施例中被引用函数的两种不同更新方式的示意图。更新前被引用函数的表达式为FuncA(a1,a2)。可选地,被引用函数的表达式可被更新为FuncA(a1,a3)或FuncA(a1,a2,a3)。如果被引用函数的表达式更新为FuncA(a1,a3),则重新计算被引用函数的表达式FuncA(a1,a3)并更新其计算结果,以得到更新后的正确结果。遍历被引用函数FuncA的依赖列表,根据预先建立的被引用函数FuncA优先于函数FuncB进行计算的优先级关系,更新在被引用函数FuncA之后进行计算的所有函数的表达式及其计算结果,这里为更新函数FuncB的表达式及其计算结果。

区别于相关技术,本申请通过建立被引用函数的依赖列表,可以实现在计算过程中,当被引用函数的表达式更新时,函数的表达式的自动更新。如在机器人操作产线上,有两个线程运行不同的操作,当某一个线层需要调用另一个线层的结果作为本线层参数时,通过上述方式可以提高调用结果的正确性。

图8示出了本申请计算机设备一实施例的结构示意图。参阅图8,本申请实施例中的计算机设备100包括:包括处理器101、存储器102及其存储的指令。处理器101执行指令时实现如上述任一实施例方法的步骤。

处理器101还可以称为CPU(Central Processing Unit,中央处理单元)。处理器101还可能是一种集成电路芯片,具有信号的处理能力。处理器101还可以是通用处理器、数字信号处理器(DSP)、专用集成电路(ASIC)、现成可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。

区别于相关技术,本申请通过引用参数来代替被引用函数的表达式,使得函数的表达式可以组织;响应于函数参数为引用参数,将函数对应的引用索引添加到引用参数对应的被引用函数的依赖列表中,以建立被引用函数优先于函数进行计算的优先级关系,从而可以实现对函数参数是其他函数表达式的函数的解析。

以上所述仅为本申请的实施例,并非因此限制本申请的专利范围,凡是利用本申请说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本申请的专利保护范围内。

去获取专利,查看全文>

相似文献

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

客服邮箱:kefu@zhangqiaokeyan.com

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

  • 服务号