利用语法词法分析工具为编解码提供数据的方法
技术领域:
本发明涉及数据通信技术领域,特别是涉及一种在通讯网络的编解码过程中使用语法词法分析工具为通用编解码提供数据的方法。
背景技术:
ASN.1(Abstract Syntax Notation One抽象语法标记)是一种独立于机器的描述语言,用于描述在网络上传递的消息,广泛应用于移动网络通讯系统中的各种协议的传输,例如RANAP(Radio Access Network Application Part无线接入网络应用部分)协议、MAP(Mobile Application Part移动应用部分)协议、H.248协议等。
编译器是将一种语言翻译为另一种语言的计算机程序。编译器将源程序编写的程序作为输入,而产生用目标语言编写的等价程序。通常地,源程序为高级语言,如C或C++,而目标语言则是目标机器的目标代码,也就是写在计算机机器指令中的用于运行的代码。Lex(Lexical Analyzer)是一种生成扫描器的工具,扫描器是一种识别文本中的词汇模式的程序,Lex工具的语法是一种词法规则。Yacc(Yet Another Compiler Compiler)是一种可以将任何一种编程语言的所有语法翻译成针对此种语言的语法解析器,Yacc工具的语法是一种语法规则。Lex&Yacc被广泛的应用在程序语言的编译器中,检测程序语言的合法性及将语言编译成机器能够执行的机器码。
通用编解码程序在进行编解码时,编码可以根据参数的大小,起始地址,获取结构内存中的数值,再根据参数的数据类型进行编码。解码则根据参数的数据类型进行解码,并根据参数的大小,起始地址向结构中填写解码的值。还应当根据参数的赋值范围进行合法性判断等操作。这些信息,可以通过两种方式获得。一种是使用针对协议语法的分析工具分析协议的语法并按一定的格式输出,协议语法拥有自己的语法规范,对于语法的识别只能通过编写完整的语法分析工具来识别,然而协议的语法是十分复杂的,因此编写针对协议语法的分析工具也是一个复杂的系统工程。另一种通过人工读取协议语法规则,提取相应的数据,按照一定的格式填写,这样不仅工作效率低下,而且出错几率大幅提高。
发明内容:
本发明的目的就是使用词法语法分析工具的词法规则和语法规则,开发出能够分析高级语言结构以及用自定义规则(一种简化的协议语法与编程语言语法相结合的方法)记录参数属性信息并输出的分析工具,输出的数据可以为编解码提供所需的信息。该方法大大提高手工填写数据信息的效率和质量。为统一的编解码提供所需的详细准确的信息。具有简单,灵活,快捷,易读,扩展性好等特点。
为了达到上述目的,本发明提供以下技术方案:
利用语法词法分析工具为编解码提供数据的方法,包括以下步骤:
A.编写分析工具:使用词法规则、语法规则编写能够识别高级语言规范以及根据自定义规则记录的参数属性的分析工具;
B.数据结构的定义:根据协议中消息的语法描述、高级语言规范和分析工具自定义规则定义协议中消息的数据结构;
C.分析数据结构:使用分析工具分析定义的消息的数据结构文件,获取消息的结构及参数信息;
D.存储相关信息:分析工具将上述信息按照一定的格式存储到文件中,以供编解码过程调用。
所述的参数信息存储于数据表中。
所述数据表包括:消息表,结构表,参数表。
所述消息表至少包括:操作码、消息名称、消息长度和消息类型,用于记录消息的开始结构和属性。
所述结构表至少包括:结构名称、标签、类型、显示、原类型标签和结构长度。
所述参数表至少包括:参数名,结构名,类型名,变量大小和起始位置,用于记录参数的信息。
所述分析数据结构的分析流程包括:分析工具从定义的消息结构文件中匹配到一段文法;判断该文法中是否为消息,即是否包含消息的关键字;如果是消息则将消息的信息记录到消息表中;将分析出的消息自身的结构属性加入结构表中;分析工具分析出结构中的一个参数;获取参数的类型,参数名称,参数地址,参数大小等结构自身的信息;将上述信息记录到参数表中;分析工具匹配到参数的注释,在注释中分析出参数的ASN.1属性;将ASN.1属性记录到参数表中;文法分析完成后,遍历消息表、结构表和参数表,将信息写入文件中。
本发明相对于现有技术具有以下技术效果:通过使用注释的方式,按照分析工具自定义规则,把协议语法规定的参数属性注释到结构中,使得这些结构的定义即符合高级语言规范,又记录了协议语法,因此无需开发针对协议语法的语法分析器,简化了程序开发的难度,提高了程序的可读性,在不影响程序编译运行的前提下,为应用层使用数据结构提供了方便。
协议发生改变或协议版本升级时,只需修改根据协议定义消息的数据结构文件,用分析工具重新分析,即可获得新协议的结构信息。本发明与人工修改信息相比具有安全,快捷和简单的特点。
本方法还提供了一种简化分析工具程序逻辑的方式。使得分析工具能够以简单的方法实现复杂逻辑,使得分析工具能够快速开发。
附图说明:
图1为词法语法分析工具的原理图;
图2为分析工具向编解码过程提供数据的流程图;
图3为分析工具的Lex&Yacc的词法规则和语法规则;
图4为C语言编译器转换ASN.1字符串类型宏的原理图;
图5为几种典型的ASN.1数据类型同C语言数据类型的对应关系;
图6为分析工具分析过程中用于临时保存结构信息的表结构和相互关系;
图7为分析工具的分析流程;
图8为消息结构参数信息的存储方式。
具体实施方式:
以下结合附图详细说明本发明的具体实施方式。本实施例中使用的高级语言为C语言,协议语法为ASN.1,词法语法分析工具为Lex&Yacc。
图1为词法语法分析工具的原理图;将包含了正则表达式的词法语法规则作为分析工具的输入规则,为每一个词法表达式被匹配时定义一种动作。用于通知语法规则,为每一个语法规则被匹配时也定义一种动作,根据定义的动作保存所需的数据。编译器根据词法语法规则生成分析工具。分析工具指定根据协议定义的消息的数据结构文件作为它的输入,并根据词法语法规则的分析过程,记录结构属性和ASN.1属性,并产生特定格式的输出文件,即图8格式的结构信息数据。
图2为分析工具向编解码过程提供数据的流程图,其包括:
步骤201:使用词法规则、语法规则编写能够识别高级语言规范以及根据自定义规则记录的协议属性的分析工具;
步骤202:根据协议中消息的协议的语法描述、高级语言规范和分析工具自定义规则定义协议中消息的数据结构;
步骤203:使用分析工具分析定义的数据结构文件,获取结构中的参数信息;
步骤204:分析工具将获取的结构信息,按照一定的格式存储到文件中,用于为编解码过程提供信息。
图3展示了Lex&Yacc的词法规则和语法规则,结构包括:结构定义,结构名和注释。结构定义包括:结构参数列表。结构参数列表包括:参数选用标志,结构参数,注释。结构参数定义包括:类型定义和宏定义,类型定义包含所有ASN.1的非字符串类型。宏定义包含ASN.1的所有字符串类型。注释中包含了用自定义规则定义的ASN.1属性和关键字。
图4为C语言编译器转换ASN.1字符串类型宏的原理图,将ASN.1的字符串类型定义成C语言的带参数宏,可以一种简化分析工具的分析逻辑。使得定义结构时,ASN.1的字符串类型只占一行,C编译器编译时会替换的结构中的宏,形成结构嵌套结构的参数定义方式,而分析工具无需分析其中的嵌套结构,使得工具分析数据时只需要将每一行都作为一个整体参数来个分析,从而简化了编写分析工具的难度。
图5为几种典型的ASN.1数据类型同C语言数据类型的对应关系;定义结构时按照对应关系将ASN.1描述的数据转换成C数据类型。分析工具通过对C数据类型的分析获取ASN.1数据类型并记录数据信息。
图6展示了用于存储中间分析结果的数据表以及表之间的父子关系。数据表包括:消息表,结构表,参数表。
1.消息表:由操作码,消息名称,消息长度,消息类型等参数构成。用于记录协议消息的开始结构和属性。
2.结构表:由结构名称,标签,类型,协议中的数据类型,显示或隐示,结构长度等信息构成,用于记录结构拥有的参数和作为的参数时具有的属性。
3.参数表:由参数名,结构名,类型名,变量大小,起始位置等属性字段构成,用于记录参数的信息和参数的协议属性等详细信息。
图7为分析工具的分析流程;包括以下步骤:
步骤701:分析工具从定义的协议中消息的数据结构文件中匹配到一段文法;
步骤702:判断该文法中是否为消息,即是否包含消息的关键字;
步骤703:如果是消息则将消息的信息记录到图6所示的消息表中;
步骤704:将分析出的消息自身的结构属性加入到图6所示的结构表中;
步骤705:分析工具分析出结构中的一个参数;
步骤706:获取参数的类型,参数名称,参数地址,参数大小等结构自身的信息;
步骤707:将参数信息记录到图6所示的参数表中;
步骤708:分析工具匹配到参数的注释,在注释中分析出标签、可选/必选、赋值范围等参数拥有的ASN.1属性;
步骤709:将分析出的ASN.1属性记录到参数图6所示的参数表中该参数的相应字段中;
步骤710:判断结构文件是否结束,未结束转入步骤701继续进行文法分析;
步骤711:分析完成时,图6所示的三张表(消息表,结构表和参数表)中记录了所有消息的结构,子结构,参数,参数的ASN.1属性等信息,从消息表开始,遍历所有消息的结构,结构中的子结构和参数,将这些信息写入文件中(如图8),将这个文件加入到编解码过程中,就能够为编解码过程提供消息,消息的结构,结构的参数等的编解码过程中需要的详细信息。
图8展示了根据MAP(移动应用部分)协议中的插入用户数据响应消息(即图8中的InsertSubscriberDataRes)结构生成的结构及其参数的详细信息。消息由六行元素组成,每一行元素代表结构的一个参数,每一行中的一项代表参数的一个信息、ASN.1属性或参数包含的子参数指针。其中telServLst,bearServeLst,ss_List为结构参数,包含了指向子结构的指针,这些值都被编解码程序加载用于编解码。
以上公开的仅为本发明的一个具体实施例,但是本发明并非局限于此,任何本领域的技术人员能思之的变化,都应落在本发明的保护范围内。