一种通信PDU编解码器自动生成方法及系统与流程

文档序号:31194641发布日期:2022-08-20 00:17阅读:40来源:国知局
一种通信PDU编解码器自动生成方法及系统与流程
一种通信pdu编解码器自动生成方法及系统
技术领域
1.本发明涉及通信技术领域,特别指一种通信pdu编解码器自动生成方法及系统。


背景技术:

2.协议数据单元pdu(protocol data unit)指通信领域中,在网络上传输的单个数据单元,一个pdu由具体协议相关的控制信息与用户数据组合而成。不同协议有不同格式的pdu,相关的开发人员需要根据协议要求编写pdu的编解码器(编解码程序)来正确传输数据。pdu可以是文本形式或二进制形式,二进制形式的pdu因其节约带宽的特性在通信领域的标准中广泛使用,例如tetra和3gpp。
3.目前,很多pdu编解码器的代码是根据协议来手动编写的,当协议庞大复杂时会有大量的工作量,而且容易出错带来安全隐患,虽然也存在一些自动生成编解码器的工具,但这些工具存在各种局限性,很难与一些广泛使用的标准相容。
4.因此,如何提供一种通信pdu编解码器自动生成方法及系统,实现提升pdu编解码器生成的质量、效率以及泛化性,成为一个亟待解决的技术问题。


技术实现要素:

5.本发明要解决的技术问题,在于提供一种通信pdu编解码器自动生成方法及系统,实现提升pdu编解码器生成的质量、效率以及泛化性。
6.第一方面,本发明提供了一种通信pdu编解码器自动生成方法,包括如下步骤:
7.步骤s10、定义一包括pdu名、成员名以及成员类型的pdu结构,基于所述pud结构创建pdu定义文件;
8.步骤s20、对所述pdu定义文件进行语法分析,得到抽象语法树;
9.步骤s30、创建一全局符号表,基于所述抽象语法树更新全局符号表,对所述全局符号表进行语义分析,得到语义分析结果;
10.步骤s40、基于所述抽象语法树以及语义分析结果自动生成pdu编解码器的代码。
11.进一步地,所述步骤s10中,所述成员类型包括整数类型、数组类型以及引用类型。
12.进一步地,所述步骤s20具体为:
13.基于所述pdu结构编写pdu定义文件对应lalr.g4格式的语法文件,通过antlr4读取所述语法文件生成pdu编解码器的前端代码;
14.通过所述前端代码将输入pdu定义文件的字节流,基于词法分析转换为词元序列,将各所述词元序列组合生成抽象语法树;
15.所述抽象语法树包括若干个常量节点以及pdu节点,所述常量节点由常量构成,所述pdu节点由pdu定义文件构成。
16.进一步地,所述步骤s30具体包括:
17.步骤s31、创建一全局符号表,通过antlr4的visitor模式遍历所述抽象语法树,遍历到常量时直接存储至所述全局符号表,遍历到所述pdu定义文件时,创建所述pdu定义文
件对应的子符号表并存储至全局符号表;
18.步骤s32、遍历各所述pdu定义文件的各成员并加入对应的子符号表;
19.步骤s33、对所述全局符号表进行静态语义分析,得到语义分析结果。
20.进一步地,所述步骤s40具体包括:
21.步骤s41、创建一头文件,遍历所述抽象语法树的常量节点得到对应的常量,将所述常量作为宏定义保存到头文件,基于所述头文件为每一个类型的pdu定义文件分配一结构体;
22.步骤s42、遍历所述抽象语法树的pdu节点,得到各所述pdu定义文件的成员,将各所述成员的成员类型转换为目标程序语言后添加至结构体中;
23.步骤s43、基于所述语义分析结果,为每一个类型的pdu定义文件自动生成一用于将结构体转换为二进制字符串的编码函数以及一用于将二进制字符串转换为结构体的解码函数,基于所述编码函数以及解码函数自动生成pdu编解码器的代码。
24.第二方面,本发明提供了一种通信pdu编解码器自动生成系统,包括如下模块:
25.pdu定义文件创建模块,用于定义一包括pdu名、成员名以及成员类型的pdu结构,基于所述pud结构创建pdu定义文件;
26.语法分析模块,用于对所述pdu定义文件进行语法分析,得到抽象语法树;
27.语义分析模块,用于创建一全局符号表,基于所述抽象语法树更新全局符号表,对所述全局符号表进行语义分析,得到语义分析结果;
28.pdu编解码器生成模块,用于基于所述抽象语法树以及语义分析结果自动生成pdu编解码器的代码。
29.进一步地,所述pdu定义文件创建模块中,所述成员类型包括整数类型、数组类型以及引用类型。
30.进一步地,所述语法分析模块具体为:
31.基于所述pdu结构编写pdu定义文件对应lalr.g4格式的语法文件,通过antlr4读取所述语法文件生成pdu编解码器的前端代码;
32.通过所述前端代码将输入pdu定义文件的字节流,基于词法分析转换为词元序列,将各所述词元序列组合生成抽象语法树;
33.所述抽象语法树包括若干个常量节点以及pdu节点,所述常量节点由常量构成,所述pdu节点由pdu定义文件构成。
34.进一步地,所述语义分析模块具体包括:
35.全局符号表创建单元,用于创建一全局符号表,通过antlr4的visitor模式遍历所述抽象语法树,遍历到常量时直接存储至所述全局符号表,遍历到所述pdu定义文件时,创建所述pdu定义文件对应的子符号表并存储至全局符号表;
36.子符号表更新单元,用于遍历各所述pdu定义文件的各成员并加入对应的子符号表;
37.语义分析结果生成单元,用于对所述全局符号表进行静态语义分析,得到语义分析结果。
38.进一步地,所述pdu编解码器生成模块具体包括:
39.结构体生成单元,用于创建一头文件,遍历所述抽象语法树的常量节点得到对应
的常量,将所述常量作为宏定义保存到头文件,基于所述头文件为每一个类型的pdu定义文件分配一结构体;
40.结构体填充单元,用于遍历所述抽象语法树的pdu节点,得到各所述pdu定义文件的成员,将各所述成员的成员类型转换为目标程序语言后添加至结构体中;
41.代码生成单元,用于基于所述语义分析结果,为每一个类型的pdu定义文件自动生成一用于将结构体转换为二进制字符串的编码函数以及一用于将二进制字符串转换为结构体的解码函数,基于所述编码函数以及解码函数自动生成pdu编解码器的代码。
42.本发明的优点在于:
43.通过定义pdu结构,用户基于pud结构创建pdu定义文件,再对pdu定义文件进行语法分析得到抽象语法树,接着基于抽象语法树更新创建的全局符号表,对全局符号表进行语义分析得到语义分析结果,最后基于抽象语法树以及语义分析结果即可自动生成pdu编解码器的代码,即用户仅需创建pdu定义文件即可自动生成pdu编解码器的代码,不仅节约代码编写时间、还避免人工编写而导致的错误,且适用于各种类型的pdu定义文件,最终极大的提升了pdu编解码器生成的质量、效率以及泛化性。
附图说明
44.下面参照附图结合实施例对本发明作进一步的说明。
45.图1是本发明一种通信pdu编解码器自动生成方法的流程图。
46.图2是本发明一种通信pdu编解码器自动生成系统的结构示意图。
47.图3是本发明抽象语法树的结构示意图。
具体实施方式
48.请参照图1至图3所示,本发明一种通信pdu编解码器自动生成方法的较佳实施例,包括如下步骤:
49.步骤s10、定义一包括pdu名、成员名以及成员类型的pdu结构,基于所述pud结构创建pdu定义文件;
50.步骤s20、对所述pdu定义文件进行语法分析,得到抽象语法树;
51.步骤s30、创建一全局符号表,基于所述抽象语法树更新全局符号表,对所述全局符号表进行语义分析,得到语义分析结果;
52.步骤s40、基于所述抽象语法树以及语义分析结果自动生成pdu编解码器的代码。
53.所述步骤s10中,所述成员类型包括整数类型、数组类型以及引用类型。
54.所述整数类型是最基础的类型,所有更复杂的类型都依赖整数类型,包括8位、16位、32位、64位、128位的有符号和无符号的整数;整数类型还提供了可选的前缀,little和big表示字节序,如:little int16表示小端有符号16位整数;big uint32表示无符号32位整数。同时,整数类型还支持常量约束操作,使pdu中的某一成员必须等于给定的常量,否则解码过程中会出现报错。
55.所述数组类型是一种线性数组,其表达式为:[n],n为数组的大小,其值可以为定义的常量,或是同一个pdu中定义在前面的成员名;编码序列化时,会读取n个数据写入二进制数据中;解码反序列化时,会从二进制数据里读取n个数据。
[0056]
所述引用类型可以引用另一个pdu作为成员类型,形成层叠式的引用链,引用链中不能出现递归引用。
[0057]
所述步骤s20具体为:
[0058]
基于所述pdu结构编写pdu定义文件对应lalr.g4格式的语法文件,通过antlr4读取所述语法文件生成pdu编解码器的前端代码;
[0059]
通过所述前端代码将输入pdu定义文件的字节流,基于词法分析转换为词元序列,将各所述词元序列组合生成抽象语法树;
[0060]
所述抽象语法树包括若干个常量节点以及pdu节点,所述常量节点由常量构成,所述pdu节点由pdu定义文件构成。
[0061]
antlr是一款先进的语法分析器自动生成工具,可以读取、处理并翻译或执行结构化的文本或二进制文件。只要提供满足lalr语法要求的语法定义文件,antlr就能生成c++或java形式的语法分析器,同时提供了多种遍历、处理语法树的方法,生成的语法树有很强的拓展性,为语言处理程序的开发节省了大量时间。
[0062]
所述步骤s30具体包括:
[0063]
步骤s31、创建一全局符号表,通过antlr4的visitor模式遍历所述抽象语法树,遍历到常量时直接存储至所述全局符号表,遍历到所述pdu定义文件时,创建所述pdu定义文件对应的子符号表并存储至全局符号表;此轮遍历不需要遍历解析所述pdu定义文件的内部,只要更新所述全局符号表即可,为后续的递归检测做准备;
[0064]
步骤s32、遍历各所述pdu定义文件的各成员并加入对应的子符号表;如果有被引用的成员,需要保证该成员已在所述全局符号表,当成员的类型为引用类型时,应递归检测被引用类型的pdu定义文件的内部定义,如果出现未定义的,递归时要报错;
[0065]
数组类型的长度必须为常量、数字或者同pdu中整数类型的成员,如果是整数类型的成员,需要确保这个被引用的整数成员位于该数组类型成员之前;
[0066]
步骤s33、对所述全局符号表进行静态语义分析,得到语义分析结果。
[0067]
所述步骤s40具体包括:
[0068]
步骤s41、创建一头文件,遍历所述抽象语法树的常量节点得到对应的常量,将所述常量作为宏定义保存到头文件,基于所述头文件为每一个类型的pdu定义文件分配一结构体;
[0069]
步骤s42、遍历所述抽象语法树的pdu节点,得到各所述pdu定义文件的成员,将各所述成员的成员类型转换为目标程序语言后添加至结构体中;例如将整数类型、数组类型和引用类型都能直接化为c语言中的元素添加至结构体中,其中引用类型是直接作为嵌套的结构体保存的;
[0070]
步骤s43、基于所述语义分析结果,为每一个类型的pdu定义文件自动生成一用于将结构体转换为二进制字符串的编码函数以及一用于将二进制字符串转换为结构体的解码函数,基于所述编码函数以及解码函数自动生成pdu编解码器的代码。
[0071]
编码函数中数字的字节序根据定义的big或little选择对应的大小端,默认为大端;对于数组类型的成员,如果长度标识为定义的常量或数字,直接转换为对应数字,否则使用输入结构体中对应字段代替。解码函数用与编码函数相同的逻辑处理数组类型,并时刻计算已解码数据的长度,保证不会出现缓存溢出的漏洞。
[0072]
本发明一种通信pdu编解码器自动生成系统的较佳实施例,包括如下模块:
[0073]
pdu定义文件创建模块,用于定义一包括pdu名、成员名以及成员类型的pdu结构,基于所述pud结构创建pdu定义文件;
[0074]
语法分析模块,用于对所述pdu定义文件进行语法分析,得到抽象语法树;
[0075]
语义分析模块,用于创建一全局符号表,基于所述抽象语法树更新全局符号表,对所述全局符号表进行语义分析,得到语义分析结果;
[0076]
pdu编解码器生成模块,用于基于所述抽象语法树以及语义分析结果自动生成pdu编解码器的代码。
[0077]
所述pdu定义文件创建模块中,所述成员类型包括整数类型、数组类型以及引用类型。
[0078]
所述整数类型是最基础的类型,所有更复杂的类型都依赖整数类型,包括8位、16位、32位、64位、128位的有符号和无符号的整数;整数类型还提供了可选的前缀,little和big表示字节序,如:little int16表示小端有符号16位整数;big uint32表示无符号32位整数。同时,整数类型还支持常量约束操作,使pdu中的某一成员必须等于给定的常量,否则解码过程中会出现报错。
[0079]
所述数组类型是一种线性数组,其表达式为:[n],n为数组的大小,其值可以为定义的常量,或是同一个pdu中定义在前面的成员名;编码序列化时,会读取n个数据写入二进制数据中;解码反序列化时,会从二进制数据里读取n个数据。
[0080]
所述引用类型可以引用另一个pdu作为成员类型,形成层叠式的引用链,引用链中不能出现递归引用。
[0081]
所述语法分析模块具体为:
[0082]
基于所述pdu结构编写pdu定义文件对应lalr.g4格式的语法文件,通过antlr4读取所述语法文件生成pdu编解码器的前端代码;
[0083]
通过所述前端代码将输入pdu定义文件的字节流,基于词法分析转换为词元序列,将各所述词元序列组合生成抽象语法树;
[0084]
所述抽象语法树包括若干个常量节点以及pdu节点,所述常量节点由常量构成,所述pdu节点由pdu定义文件构成。
[0085]
antlr是一款先进的语法分析器自动生成工具,可以读取、处理并翻译或执行结构化的文本或二进制文件。只要提供满足lalr语法要求的语法定义文件,antlr就能生成c++或java形式的语法分析器,同时提供了多种遍历、处理语法树的方法,生成的语法树有很强的拓展性,为语言处理程序的开发节省了大量时间。
[0086]
所述语义分析模块具体包括:
[0087]
全局符号表创建单元,用于创建一全局符号表,通过antlr4的visitor模式遍历所述抽象语法树,遍历到常量时直接存储至所述全局符号表,遍历到所述pdu定义文件时,创建所述pdu定义文件对应的子符号表并存储至全局符号表;此轮遍历不需要遍历解析所述pdu定义文件的内部,只要更新所述全局符号表即可,为后续的递归检测做准备;
[0088]
子符号表更新单元,用于遍历各所述pdu定义文件的各成员并加入对应的子符号表;如果有被引用的成员,需要保证该成员已在所述全局符号表,当成员的类型为引用类型时,应递归检测被引用类型的pdu定义文件的内部定义,如果出现未定义的,递归时要报错;
[0089]
数组类型的长度必须为常量、数字或者同pdu中整数类型的成员,如果是整数类型的成员,需要确保这个被引用的整数成员位于该数组类型成员之前;
[0090]
语义分析结果生成单元,用于对所述全局符号表进行静态语义分析,得到语义分析结果。
[0091]
所述pdu编解码器生成模块具体包括:
[0092]
结构体生成单元,用于创建一头文件,遍历所述抽象语法树的常量节点得到对应的常量,将所述常量作为宏定义保存到头文件,基于所述头文件为每一个类型的pdu定义文件分配一结构体;
[0093]
结构体填充单元,用于遍历所述抽象语法树的pdu节点,得到各所述pdu定义文件的成员,将各所述成员的成员类型转换为目标程序语言后添加至结构体中;例如将整数类型、数组类型和引用类型都能直接化为c语言中的元素添加至结构体中,其中引用类型是直接作为嵌套的结构体保存的;
[0094]
代码生成单元,用于基于所述语义分析结果,为每一个类型的pdu定义文件自动生成一用于将结构体转换为二进制字符串的编码函数以及一用于将二进制字符串转换为结构体的解码函数,基于所述编码函数以及解码函数自动生成pdu编解码器的代码。
[0095]
编码函数中数字的字节序根据定义的big或little选择对应的大小端,默认为大端;对于数组类型的成员,如果长度标识为定义的常量或数字,直接转换为对应数字,否则使用输入结构体中对应字段代替。解码函数用与编码函数相同的逻辑处理数组类型,并时刻计算已解码数据的长度,保证不会出现缓存溢出的漏洞。
[0096]
综上所述,本发明的优点在于:
[0097]
通过定义pdu结构,用户基于pud结构创建pdu定义文件,再对pdu定义文件进行语法分析得到抽象语法树,接着基于抽象语法树更新创建的全局符号表,对全局符号表进行语义分析得到语义分析结果,最后基于抽象语法树以及语义分析结果即可自动生成pdu编解码器的代码,即用户仅需创建pdu定义文件即可自动生成pdu编解码器的代码,不仅节约代码编写时间、还避免人工编写而导致的错误,且适用于各种类型的pdu定义文件,最终极大的提升了pdu编解码器生成的质量、效率以及泛化性。
[0098]
虽然以上描述了本发明的具体实施方式,但是熟悉本技术领域的技术人员应当理解,我们所描述的具体的实施例只是说明性的,而不是用于对本发明的范围的限定,熟悉本领域的技术人员在依照本发明的精神所作的等效的修饰以及变化,都应当涵盖在本发明的权利要求所保护的范围内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1