利索能及
我要发布
收藏
专利号: 2024107143565
申请人: 南京信息工程大学
专利类型:发明专利
专利状态:已下证
更新日期:2026-06-16
缴费截止日期: 暂无
联系人

摘要:

权利要求书:

1.一种跨平台应用层协议解析器自动生成方法,其特征在于,包括以下步骤:

S1:定义协议中所有消息类型及其数据流转关系,并为每种消息类型定义内部字段,针对需要分支解析或条件解析的字段定义条件表达式或分支逻辑,并根据解析需要设置事件监听器,得到解析器规范文件;

S2:对解析器规范文件进行词法、语法分析,将解析器规范文件按照预定的规则分解为一组协议词法单元,并从协议词法单元序列中逐个提取元素,利用递归下降方法构建出反映协议结构和原始解析逻辑的抽象语法树;

S3:对生成的抽象语法树的各个节点进行合法性检查,包括字段类型是否正确,字段属性是否符合规则,不同字段之间的依赖关系是否正确建立,每个标识符的引用与其声明是否正确绑定,若发现错误则终止生成并输出错误信息;

S4:递归遍历合法性检查后的抽象语法树,并对每种节点类型实施转换逻辑,包括映射基础和复合数据类型、处理字段属性以及控制解析流程,从而得到一种平台无关的中间表示;

S5:对生成的中间表示进行包括合并连续操作指令、移除未被调用或无影响的代码、函数内联替换和全局变量和常量重新编号的优化,将优化后的中间表示定义的数据结构和函数逻辑映射到C++类、方法和数据类型,嵌入解析逻辑、资源管理策略和错误处理逻辑,添加编译指令和环境配置信息,最后得到符合性能要求的C++解析器源代码;

其中,所述步骤S1包括:

S101:梳理并确定协议中所包含的所有消息类型,利用智能解析定义语言定义所有消息类型,并描述各消息类型之间的数据流转关系;

S102:针对每种消息类型逐一定义所包含的字段,为每个字段指派一个明确的标识符和在该字段在消息中的序列位置;

S103:基于字段在协议中承载的数据性质与格式,为每个字段指定数据类型,接着根据字段的具体解析需求和预期的解析行为,为每个字段配置字段属性;

S104:对需要分支解析或条件解析的字段定义条件表达式或分支逻辑,对解析流程的指定节点设置解析事件监听器,最终得到基于规范语言的解析器规范文件;

所述智能解析定义语言通过静态协议描述和动态解析行为,实现对应用协议结构的描述与解析流程控制,包括:(1)解析器头部定义:通过protocol关键字在每个规范文件开头定义一个新的协议解析器,标志着规范文件的开始,并为其命名;

(2)消息类型定义:通过message关键字定义协议中的消息类型,每种消息类型代表协议中的一个数据包或消息结构,包含基础数据类型和/或复杂数据类型;

基础数据类型包括:比特、位域、字节、地址、整数、浮点数、布尔值、字符串;

复杂数据类型包括:

结构体Struct:通过Struct关键字将多个不同类型的字段组合为一个单一的逻辑单元;

枚举Enum:通过Enum关键字定义一组命名常量;

(3)字段属性:通过在字段定义中直接指定相应的属性参数来实现支持对网络协议字段的细粒度解析控制,包括:&ByteOrder:字节顺序属性,用于标识处理输入数据的顺序,默认情况下为网络字节顺序,其中&是标识符,表示这是一个字段属性;

&Requires:字段约束属性,用于为字段的解析添加后置条件,通过对布尔表达式进行判断,若返回false,解析过程将中止并返回错误;

&Size:规定接受字段大小属性,用于指定处理的原始字节数,并且该属性的优先级高于其他控制解析属性;

&MaxSize:限制字段最大输入属性,用于设置字段接收的数据大小上限,如果在解析过程中消耗了超过预设大小的字节数,则发生错误,并且该属性的优先级高于其他控制解析属性;

&Anoymous:匿名属性,用于将字段变为匿名字段,字段调用该属性后,虽然参与解析,但不会在解析完成后存储结果,仅在解析中引用该字段解析的值;

&Skip:跳过属性,该字段配合属性&Size使用,即跳过规定大小的数据,不参与解析;

&Convert:动态类型转换属性,字段使用该属性来转换刚刚被解析的值,然后将其存储为字段的最终值;

(4)解析流程控制,包括:

条件解析和switch分支解析:条件解析通过字段添加if (COND)子句来实现条件性解析,COND是一个布尔表达式,当布尔表达式在字段解析时刻评估为真时,字段才对被解析;

switch分支解析通过计算switch表达式的值,如果结果匹配,则继续分析相应的字段;

解析事件监听器:通过设置一系列指定的代码块,在解析过程中的某个事件触发,实现对解析流程的更细致管理,监听器事件具体包括:event.int() {···}表示在解析开始之前执行,event.done() {···}表示在解析完成后执行,event.error() {···}表示在遇到错误时执行,event. {···}表示在解析完指定字段field name后执行,解析后的值通过$访问,使解析结果能够立即被处理或验证;当为同一个事件定义了多个监听器时,按照设定顺序逐一执行;

(5)数据流管理,包括:

解析域机制,适用于需要在解析过程中保留信息的场景,用于在解析不同消息类型时共享和传递信息,此时将上下文视作一个被“保护”的全局变量,能够在解析过程的任意点被初始化、修改或引用,从而实现对解析逻辑的动态调整;

所述步骤S3包括:

S301:基于静态类型系统,根据字段声明的类型信息及其预期操作进行类型推断,针对每一项操作执行类型兼容性检查,确认操作字段与字段类型的匹配性,若发生不匹配的操作,则报告错误;

S302:基于协议字段的属性规范集,利用预定义的字段可用属性集对每个字段的属性声明进行审查,使得每项属性值均位于规定的范围内,若检测到属性值超出预定范围,则报告错误;

S303:检查协议描述中各字段之间的逻辑和数据依赖关系是否被正确反映,识别并确认所有直接或间接的字段依赖,并校验依赖字段的值是否已在使用前正确设置,若依赖关系未按预期实现或与协议规范不符,则报告错误;

S304:通过建立全局标识符表,记录所有标识符的声明信息,检查每个标识符的使用是否均能够被引用到一个有效的声明,当遇到一个标识符引用时,将其与声明信息进行匹配和绑定,如果无法找到相应的声明或存在多个声明冲突,则报告错误;

所述步骤S4中,针对数据类型映射,若类型为位域,确定其大小和边界,映射至其所在的最小可寻址存储字节,并实现对位域的位运算支持;若类型为字节,直接识别并映射字节类型字段;若类型为地址,确定地址类型,将IPv4地址映射为32位数值类型,IPv6地址映射为128位数值类型;若类型为整数或浮点数,根据字段的位数和有无符号,将整数映射到相应数值类型,将浮点数数字段映射至遵循IEEE 754标准的浮点类型;若类型为布尔值,映射为单比特,但仍存储在一个完整字节中;若类型为字符串,将字符串中的每个字符转换成UTF‑8编码,确定转换后的总长度,包括所有字符的UTF‑8编码总和,存储到内存空间中;若类型为结构体,为其分配连续内存空间,并映射内部成员至底层类型;若类型为枚举,将枚举的每个值映射为连续的整数序列或根据赋值自定义映射逻辑,根据枚举值的范围选择最小的底层整数类型;

针对字段属性映射,对于字节顺序属性&ByteOrder,确定协议解析器运行系统的字节顺序,根据指定的属性判断字节顺序是否需要转换,若是,将原始数据分割为单个字节,按照反转的顺序重新组合这些字节,最后将重排后的字节组合回一个整体;对于字段约束属性&Requires,根据协议规范解析出字段的值,判断解析出的值是否满足约束条件,若是,将数据存储到相应的数据结构中,若不是,跳过存储过程,记录错误信息并抛出异常;对于字段大小属性&Size、&MaxSize,根据字段属性确定字段的大小或限制,在解析数据时,对于流式数据,追踪已接受数据的累积大小,对于一次性读取的数据,检查数据块的总大小,判断其是否在允许范围内,若是,继续正常数据处理流程,若不是,拒绝接收数据,记录错误信息并抛出异常;对于匿名属性&Anoymous,按照定义的数据类型和格式从输入流中读取和解析数据,检查是否有对字段的临时操作,对临时操作进行处理,解析结果不进行存储;对于跳过属性&Skip,遇到标记为跳过的字段时,解析器移动数据指针跳过指定大小的数据块,不进行任何解析或处理;对于动态类型转化属性&Convert,解析出字段的原始值,根据动态类型转换属性指定的目标类型调用转换函数生成新的数据表示,并将数据表示存储到数据结构中;

针对解析流程控制映射,对于条件解析,基于抽象化的控制流图CFG构建,每个条件判断节点在CFG中形成一个分支点,每个分支对应不同的执行路径,对于分支解析,基于多路分支的决策树构建,每个分支结构转换为一系列条件检查与相应的跳转指令,使得在满足指定条件时能够跳转到正确的代码段执行;对于解析事件监听器,遵循事件驱动模型的转换原则,抽象语法树中事件监听器节点被抽象为中间表示的一组事件处理函数,通过建立一个事件绑定与触发机制,使得在事件发生时能够自动调用与其关联的事件处理逻辑;

针对数据流管理映射,识别每个变量的定义和使用点,构建变量的作用域和声明周期,生成代码时将插入数据存储和访问指令,使得数据在需要时可用,且在不再需要时释放,优化内存使用;上下文信息基于封装和继承原则,通过定义包含上下文信息的数据结构,并将这些结构作为参数传递给需要的函数或方法,实现上下文信息在解析过程中的传递与维护;状态管理基于有限状态机模型,每个状态都映射为中间表示中的一个变量,状态转换逻辑通过在满足指定条件时更新变量的值,从而在解析过程中动态地改变解析行为。

2.根据权利要求1所述的方法,其特征在于,对生成的中间表示进行包括合并连续操作指令、移除未被调用或无影响的代码、函数内联替换和全局变量和常量重新编号的优化包括:分析中间表示IR中的操作序列,将多个连续且独立的操作合并成单一符合操作,实现连续操作指令;通过静态分析工具检测未被任何其他代码引用的函数和变量,并将这些代码移除;对调用次数超过指定次数或体积小于指定大小的函数进行内联处理,在调用点直接替换为函数体内容;对全局变量和常量进行重新编号,根据访问频率和依赖关系优化在其内存的布局。

3.根据权利要求1所述的方法,其特征在于,将优化后的中间表示定义的数据结构和函数逻辑映射到C++类、方法和数据类型,嵌入解析逻辑、资源管理策略和错误处理逻辑,添加编译指令和环境配置信息,最后得到符合性能要求的C++解析器源代码,具体包含:从优化后的中间表示中提取出定义的所有数据结构,转换成C++中的类;根据中间表示中描述的算法和过程,实现相应的C++函数;并采用C++的资源管理技术,确保程序的健壮性和安全性,通过构建错误处理机制,提高代码的健壮性。

4.一种跨平台应用层协议解析器自动生成装置,其特征在于,包括:

协议规范定义模块,定义协议中所有消息类型及其数据流转关系,并为每种消息类型定义内部字段,针对需要分支解析或条件解析的字段定义条件表达式或分支逻辑,并根据解析需要设置事件监听器,得到解析器规范文件;

抽象语法树构建模块,对解析器规范文件进行词法、语法分析,将文本按照预定的规则分解为一组协议词法单元,并从协议词法单元序列中逐个提取元素,利用递归下降方法构建出反映协议结构和原始解析逻辑的抽象语法树;

合法性检查模块,对生成的抽象语法树的各个节点进行合法性检查,包括字段类型是否正确,字段属性是否符合规则,不同字段之间的依赖关系是否正确建立,每个标识符的引用与其声明是否正确绑定,若发现错误则终止生成并输出错误信息;

逻辑转换模块,递归遍历合法性检查后的抽象语法树,并对每种节点类型实施转换逻辑,包括映射基础和复合数据类型、处理字段属性以及控制解析流程,从而得到一种平台无关的中间表示;

解析器生成模块,对生成的中间表示进行包括合并连续操作指令、移除未被调用或无影响的代码、函数内联替换和全局变量和常量重新编号的优化,将优化后的中间表示定义的数据结构和函数逻辑映射到C++类、方法和数据类型,嵌入解析逻辑、资源管理策略和错误处理逻辑,添加编译指令和环境配置信息,最后得到符合高性能要求的C++解析器源代码;

其中,协议规范定义模块的处理过程包括:

梳理并确定协议中所包含的所有消息类型,利用智能解析定义语言定义所有消息类型,并描述各消息类型之间的数据流转关系;

针对每种消息类型逐一定义所包含的字段,为每个字段指派一个明确的标识符和在该字段在消息中的序列位置;

基于字段在协议中承载的数据性质与格式,为每个字段指定数据类型,接着根据字段的具体解析需求和预期的解析行为,为每个字段配置字段属性;

对需要分支解析或条件解析的字段定义条件表达式或分支逻辑,对解析流程的指定节点设置解析事件监听器,最终得到基于规范语言的解析器规范文件;

所述智能解析定义语言通过静态协议描述和动态解析行为,实现对应用协议结构的描述与解析流程控制,包括:(1)解析器头部定义:通过protocol关键字在每个规范语言文件开头定义一个新的协议解析器,标志着协议规范文件的开始,并为其命名;

(2)消息类型定义:通过message关键字定义协议中的消息类型,每种消息类型代表协议中的一个数据包或消息结构,包含基础数据类型和/或复杂数据类型;

基础数据类型包括:比特、位域、字节、地址、整数、浮点数、布尔值、字符串;

复杂数据类型包括:

结构体Struct:通过Struct关键字将多个不同类型的字段组合为一个单一的逻辑单元;

枚举Enum:通过Enum关键字定义一组命名常量;

(3)字段属性:通过在字段定义中直接指定相应的属性参数来实现支持对网络协议字段的细粒度解析控制,包括:&ByteOrder:字节顺序属性,用于标识处理输入数据的顺序,默认情况下为网络字节顺序,其中&是标识符,表示这是一个字段属性;

&Requires:字段约束属性,用于为字段的解析添加后置条件,通过对布尔表达式进行判断,若返回false,解析过程将中止并返回错误;

&Size:规定接受字段大小属性,用于指定处理的原始字节数,并且该属性的优先级高于其他控制解析属性;

&MaxSize:限制字段最大输入属性,用于设置字段接收的数据大小上限,如果在解析过程中消耗了超过预设大小的字节数,则发生错误,并且该属性的优先级高于其他控制解析属性;

&Anoymous:匿名属性,用于将字段变为匿名字段,字段调用该属性后,虽然参与解析,但不会在解析完成后存储结果,仅在解析中引用该字段解析的值;

&Skip:跳过属性,该字段配合属性&Size使用,即跳过规定大小的数据,不参与解析;

&Convert:动态类型转换属性,字段使用该属性来转换刚刚被解析的值,然后将其存储为字段的最终值;

(4)解析流程控制,包括:

条件解析和switch分支解析:条件解析通过字段添加if (COND)子句来实现条件性解析,COND是一个布尔表达式,当布尔表达式在字段解析时刻评估为真时,字段才对被解析;

switch分支解析通过计算switch表达式的值,如果结果匹配,则继续分析相应的字段;

解析事件监听器:通过设置一系列指定的代码块,在解析过程中的某个事件触发,实现对解析流程的更细致管理,监听器事件具体包括:event.int() {···}表示在解析开始之前执行,event.done() {···}表示在解析完成后执行,event.error() {···}表示在遇到错误时执行,event. {···}表示在解析完指定字段field name后执行,解析后的值通过$访问,使解析结果能够立即被处理或验证;当为同一个事件定义了多个监听器时,按照设定顺序逐一执行;

(5)数据流管理,包括:

解析域机制,适用于需要在解析过程中保留信息的场景,用于在解析不同消息类型时共享和传递信息,此时将上下文视作一个被“保护”的全局变量,能够在解析过程的任意点被初始化、修改或引用,从而实现对解析逻辑的动态调整;

所述合法性检查模块的处理过程包括:

基于静态类型系统,根据字段声明的类型信息及其预期操作进行类型推断,针对每一项操作执行类型兼容性检查,确认操作字段与字段类型的匹配性,若发生不匹配的操作,则报告错误;

基于协议字段的属性规范集,利用预定义的字段可用属性集对每个字段的属性声明进行审查,使得每项属性值均位于规定的范围内,若检测到属性值超出预定范围,则报告错误;

检查协议描述中各字段之间的逻辑和数据依赖关系是否被正确反映,识别并确认所有直接或间接的字段依赖,并校验依赖字段的值是否已在使用前正确设置,若依赖关系未按预期实现或与协议规范不符,则报告错误;

通过建立全局标识符表,记录所有标识符的声明信息,检查每个标识符的使用是否均能够被引用到一个有效的声明,当遇到一个标识符引用时,将其与声明信息进行匹配和绑定,如果无法找到相应的声明或存在多个声明冲突,则报告错误;

所述逻辑转换模块中,针对数据类型映射,若类型为位域,确定其大小和边界,映射至其所在的最小可寻址存储字节,并实现对位域的位运算支持;若类型为字节,直接识别并映射字节类型字段;若类型为地址,确定地址类型,将IPv4地址映射为32位数值类型,IPv6地址映射为128位数值类型;若类型为整数或浮点数,根据字段的位数和有无符号,将整数映射到相应数值类型,将浮点数数字段映射至遵循IEEE 754标准的浮点类型;若类型为布尔值,映射为单比特,但仍存储在一个完整字节中;若类型为字符串,将字符串中的每个字符转换成UTF‑8编码,确定转换后的总长度,包括所有字符的UTF‑8编码总和,存储到内存空间中;若类型为结构体,为其分配连续内存空间,并映射内部成员至底层类型;若类型为枚举,将枚举的每个值映射为连续的整数序列或根据赋值自定义映射逻辑,根据枚举值的范围选择最小的底层整数类型;

针对字段属性映射,对于字节顺序属性&ByteOrder,确定协议解析器运行系统的字节顺序,根据指定的属性判断字节顺序是否需要转换,若是,将原始数据分割为单个字节,按照反转的顺序重新组合这些字节,最后将重排后的字节组合回一个整体;对于字段约束属性&Requires,根据协议规范解析出字段的值,判断解析出的值是否满足约束条件,若是,将数据存储到相应的数据结构中,若不是,跳过存储过程,记录错误信息并抛出异常;对于字段大小属性&Size、&MaxSize,根据字段属性确定字段的大小或限制,在解析数据时,对于流式数据,追踪已接受数据的累积大小,对于一次性读取的数据,检查数据块的总大小,判断其是否在允许范围内,若是,继续正常数据处理流程,若不是,拒绝接收数据,记录错误信息并抛出异常;对于匿名属性&Anoymous,按照定义的数据类型和格式从输入流中读取和解析数据,检查是否有对字段的临时操作,对临时操作进行处理,解析结果不进行存储;对于跳过属性&Skip,遇到标记为跳过的字段时,解析器移动数据指针跳过指定大小的数据块,不进行任何解析或处理;对于动态类型转化属性&Convert,解析出字段的原始值,根据动态类型转换属性指定的目标类型调用转换函数生成新的数据表示,并将数据表示存储到数据结构中;

针对解析流程控制映射,对于条件解析,基于抽象化的控制流图CFG构建,每个条件判断节点在CFG中形成一个分支点,每个分支对应不同的执行路径,对于分支解析,基于多路分支的决策树构建,每个分支结构转换为一系列条件检查与相应的跳转指令,使得在满足指定条件时能够跳转到正确的代码段执行;对于解析事件监听器,遵循事件驱动模型的转换原则,抽象语法树中事件监听器节点被抽象为中间表示的一组事件处理函数,通过建立一个事件绑定与触发机制,使得在事件发生时能够自动调用与其关联的事件处理逻辑;

针对数据流管理映射,识别每个变量的定义和使用点,构建变量的作用域和声明周期,生成代码时将插入数据存储和访问指令,使得数据在需要时可用,且在不再需要时释放,优化内存使用;上下文信息基于封装和继承原则,通过定义包含上下文信息的数据结构,并将这些结构作为参数传递给需要的函数或方法,实现上下文信息在解析过程中的传递与维护;状态管理基于有限状态机模型,每个状态都映射为中间表示中的一个变量,状态转换逻辑通过在满足指定条件时更新变量的值,从而在解析过程中动态地改变解析行为。

5.一种计算机设备,其特征在于,包括:一个或多个处理器;存储器;以及一个或多个程序,其中所述一个或多个程序被存储在所述存储器中,并且被配置为由所述一个或多个处理器执行,所述程序被处理器执行时实现如权利要求1‑3中任一项所述的跨平台应用层协议解析器自动生成方法的步骤。

6.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1‑3中任一项所述的跨平台应用层协议解析器自动生成方法的步骤。