首页> 中国专利> 一种基于ANTLR的复杂报表公式解析方法及装置

一种基于ANTLR的复杂报表公式解析方法及装置

摘要

本发明公开了一种基于ANTLR的复杂报表公式解析方法及装置,主要解决现有技术中存在的现有解析方式存在的表达式写法灵活性不足,逻辑不够集中及性能略有不足的问题。该一种基于ANTLR的复杂报表公式解析方法包括以下步骤:对词法进行定义,声明语言中合法的字符序列;对语法进行定义,定义语言中不同的语法结构;将定义的词法和定义的语法输入ANTLR中;待解析的公式输入步骤S3得到的ANTLR中得到语法树,遍历语法树得到解析结果。通过上述方案,本发明达到了解析公式的灵活性和扩展性及解析性能高的目的,具有很高的实用价值和推广价值。

著录项

  • 公开/公告号CN112270175A

    专利类型发明专利

  • 公开/公告日2021-01-26

    原文格式PDF

  • 申请/专利权人 成都四方伟业软件股份有限公司;

    申请/专利号CN202011178242.1

  • 发明设计人 张艳清;张达;巩亚辉;赖文文;

    申请日2020-10-29

  • 分类号G06F40/253(20200101);G06F40/205(20200101);

  • 代理机构

  • 代理人

  • 地址 610041 四川省成都市高新区科园三路4号1栋2层

  • 入库时间 2023-06-19 09:41:38

说明书

技术领域

本发明涉及数据查询引擎领域,具体地说,是涉及一种基于ANTLR的复杂报表公式解析方法及装置。

背景技术

复杂报表的解析必然涉及到其中公式的解析,现复杂报表中公式的解析是基于Aviator语法来解析,但Aviator的语法是受限的,它不是一门完整的语言,而只是语言的一小部分集合;其扩展点在于自定义函数。

现有这种处理方式有两点不足:一,自定义的函数只能支持函数写法,形如function(arg0, arg1…),表达式写法灵活性不足;二,自定义函数通过继承实现,每个自定义函数需要一个实现类,使得表达式的结构定义散落在源代码各处,逻辑不够集中,且Aviator的实现底层是将表达式编译为字节码,交给JVM去执行,在表达式逻辑复杂的情况下性能略有不足,难以解析复杂报表中的复杂公式,需要逐一查看,影响工作效率和进度。

发明内容

本发明的目的在于提供一种基于ANTLR的复杂报表公式解析方法及装置,以解决现有解析方式存在的表达式写法灵活性不足,逻辑不够集中及性能略有不足难以解析复杂报表中复杂公式的问题。

为了解决上述问题,本发明提供如下技术方案:

一种基于ANTLR的复杂报表公式解析方法包括以下步骤:

S1、对词法进行定义,声明语言中合法的字符序列;

S2、对语法进行定义,定义语言中不同的语法结构;

S3、将步骤S1中定义的词法和步骤S2定义的语法输入ANTLR中;

S4、待解析的公式输入步骤S3得到的ANTLR中得到语法树,遍历语法树得到解析结果。

现有复杂报表公司解析使用的Aviator内建了许多函数及表达式结构,提 供了大部分运算符开箱即用的支持,包括算术操作符、关系运算符、逻辑操作 符、位运算符、正则匹配操作符、三元表达式,并且支持操作符的优先级和括 号强制优先级,用户使用门槛低,同时用户可以根据场景自定义函数,具有一 定的灵活性;但起也存在表达式写法灵活性不足,逻辑不够集中及性能略有不 足的问题,针对前述问题。

本发明通过上述方案根据ANTLR的规则自由编写词法和语法文件,并由ANTLR生成词法分析器和语法分析器,根据分析器自定义语法解析逻辑,提供了公式编写的灵活性和扩展性,后期若有语言规则的调整或添加,只需修改词法或语法文件,并重新生成分析器及补充自定义逻辑即可,支持各类公式的解析计算,能满足多种多样的公式计算场景,具有公式编写灵活、解析性能高等特点。

进一步的,步骤S1词法定义的规则为:定义词法为key:value,key是合法字符序列的名字,value为字符串和正则表达式;value也可指其它合法规则。

进一步的,步骤S2语法定义规则为:定义语法为key:expression1 | expression2| …,key为语法名称,expression为以词法名称和语法名称的组合。

进一步的,expression按照先后顺序表达优先级,先声明的expression优先级高。

进一步的,步骤S3中将步骤S1中定义的词法和步骤S2定义的语法输入ANTLR中生成词法分析器和语法分析器。

进一步的,步骤S3中将步骤S1中定义的词法和步骤S2定义的语法输入ANTLR中生成根据语义为不同的语法结构实现具体的计算逻辑。

进一步的,步骤S4的具体过程为:

S401、待解析的公式通过词法分析器将其拆分为字符序列流;

S402、步骤S401的字符序列流通过语法分析器生成语法树;

S403、使用自定义逻辑对步骤S402的语法树进行层级遍历,得到公式的解析结果。

一种基于ANTLR的复杂报表公式解析装置包括

存储器:用于存储可执行指令;

处理器:用于执行所述存储器中存储的可执行指令,实现一种基于ANTLR的复杂报表公式解析方法。

与现有技术相比,本发明具有以下有益效果:

(1)本发明根据ANTLR的规则自由编写词法和语法文件,并由ANTLR生成词法分析器和语法分析器,根据分析器自定义语法解析逻辑,提供了公式编写的灵活性和扩展性,后期若有语言规则的调整或添加,只需修改词法或语法文件,并重新生成分析器及补充自定义逻辑即可,支持各类公式的解析计算,能满足多种多样的公式计算场景,具有公式编写灵活、解析性能高等特点。

(2)本发明能解析各类复杂报表中的复杂公式,使用范围极广,同时提高处理器处理解析复杂报表的能力,运算也更为快速,解决了字符串解析、语法分析、公式计算等难点,防止部分复杂公式难以解析的情况,保证了解析的准确性和全面性,加快了报表解析的速率,保障了这部分工作的进度。

具体实施方式

为了使本发明的目的、技术方案和优点更加清楚,下面将结合实施例对本发明作进一步地详细描述,所描述的实施例不应视为对本发明的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

对本发明实施例进行进一步详细说明之前,对本发明实施例中涉及的名词和术语进行说明,本发明实施例中涉及的名词和术语适用于如下的解释。

词法:指包含了语言所有可能的字符序列的一系列规则,这些规则通常使用正则表达式描述。

语法:指如何用语言的词法生成语言有效的字符串的一系列规则,这些规则不描述字符串的含义,也不描述任何上下文中可以用它们做什么,只描述它们的形式。

词法分析器:通常作为编译器或解释器的组件出现,它的作用是根据词法从输入字符流中分离出一个个的单词,供语法分析器使用。

语法分析器:通常作为编译器或解释器的组件出现,它的作用是进行语法检查、并构建由输入的单词组成的数据结构,一般是抽象语法树等层次化的数据结构。

抽象语法树:以树状的形式表示语言的语法结构,树上的每个节点都表示语法中的一种结构。

ANTLR:一个能根据用户定义的语法文件自动生成词法分析器和语法分析器,并将输入文本处理为可视化的语法树的开源软件。

Aviator: 一个高性能、轻量级的Java语言实现的表达式求值引擎,主要用于各种表达式的动态求值。

实施例1

一种基于ANTLR的复杂报表公式解析方法包括以下步骤:

S1、对词法进行定义,声明语言中合法的字符序列;

S2、对语法进行定义,定义语言中不同的语法结构;

S3、将步骤S1中定义的词法和步骤S2定义的语法输入ANTLR中;

S4、待解析的公式输入步骤S3得到的ANTLR中得到语法树,遍历语法树得到解析结果。

本发明通过对计算公式进行语法解析,生成语法树,对语法树进行层级遍历,并对不同的语法结构执行不同的自定义逻辑,并且提供灵活的语法扩展,可以应对复杂报表的函数计算场景,解决了复杂报表中单元格计算公式的解析问题;本发明提供对复杂报表计算公式的解析计算能力,包含基本的算术、逻辑公式以及复杂的单元格全局搜索或偏移相关公式,满足多种多样的公式计算场景,具有公式编写灵活、解析性能高等优势。

实施例2

本实施例在实施例1的基础上进一步的,步骤S1词法定义的规则为:定义词法为key:value,key是合法字符序列的名字,value为字符串和正则表达式。

实施例3

本实施例在实施例1的基础上进一步的,步骤S2语法定义规则为:定义语法为key:expression1 | expression2 | …,key为语法名称,expression为以词法名称和语法名称的组合,expression按照先后顺序表达优先级,先声明的expression优先级高;多个expression通过“|”分割组成,有固定的先后顺序,当解析一个字符串表达式时,会按顺序先后应用这些expression到表达式解析上,最后形成一颗语法树,优先级高即优先应用到表达式的语法解析中。

实施例4

本实施例在实施例1的基础上进一步的,步骤S3中将步骤S1中定义的词法和步骤S2定义的语法输入ANTLR中生成词法分析器和语法分析器,并根据语义为不同的语法结构实现具体的计算逻辑。

实施例5

本实施例在实施例4的基础上进一步的,步骤S4的具体过程为:

S401、待解析的公式通过词法分析器将其拆分为字符序列流;

S402、步骤S401的字符序列流通过语法分析器生成语法树;

S403、使用自定义逻辑对步骤S402的语法树进行层级遍历,得到公式的解析结果。

实施例6

本实施例在实施例1的基础上进一步的,一种基于ANTLR的复杂报表公式解析装置包括

存储器:用于存储可执行指令;

处理器:用于执行所述存储器中存储的可执行指令,实现一种基于ANTLR的复杂报表公式解析方法。

实施例7

本实施例在实施例1的基础上进一步的,在复杂报表中,大部分单元格只指定了数据库字段,而数据会在复杂报表推导时加载,之前在一个单元格中定义的数据库字段在数据加载后,会生成相应数量的单元格,这在对单元格定义计算公式时就很麻烦,如计算年销量环比,A1单元格表示年份,B1单元格表示销量,C1单元格表示跨年环比,C1的计算公式定义为if(&a1 > 1, b1 – b1[a1:-1], ''),该公式表示当当前年份(A1)的值在数据库中序号大于1时,表明当前不是第一年,返回当前年份对应的销量减去在数据库序号为当前年份序号减一的年份对应的销量,即年环比,否则返回空字符串。

本发明根据ANTLR的规则自由编写词法和语法文件,并由ANTLR生成词法分析器和语法分析器代码,根据分析器自定义语法解析逻辑,提供了公式编写的灵活性和扩展性,后期若有语言规则的调整或添加,只需修改词法或语法文件,并重新生成分析器及补充自定义逻辑即可。

本发明解决了复杂报表中单元格计算公式的解析问题,通过设计ANTLR的词法和语法及自定义语法树解析逻辑,解决了字符串解析、语法分析、公式计算等难点。

在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。

另外,在本发明各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。

所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

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

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

去获取专利,查看全文>

相似文献

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

客服邮箱:kefu@zhangqiaokeyan.com

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

  • 服务号