《MSVL中结构体以及结构体指针类型的扩展解释系统及其扩展方法.pdf》由会员分享,可在线阅读,更多相关《MSVL中结构体以及结构体指针类型的扩展解释系统及其扩展方法.pdf(24页珍藏版)》请在专利查询网上搜索。
1、10申请公布号CN104182216A43申请公布日20141203CN104182216A21申请号201410334324922申请日20140715G06F9/44200601G06F17/5020060171申请人西安电子科技大学地址710071陕西省西安市太白南路2号西安电子科技大学72发明人王小兵孙涛段振华赵亮田聪张南74专利代理机构北京科亿知识产权代理事务所普通合伙11350代理人汤东凤54发明名称MSVL中结构体以及结构体指针类型的扩展解释系统及其扩展方法57摘要本发明公开了一种MSVL中结构体以及结构体指针类型的扩展解释系统,具体包括结构体类型定义模块、结构体变量定义声明模块。
2、、结构体变量存储模块和结构体及结构体指针类型赋值操作处理模块;在该系统的基础上,还公开了一种MSVL中结构体以及结构体指针类型的扩展方法,该方法在MSVL基本数据类型包括整型、浮点型、字符型、字符串型和指针类型的基础之上扩展了结构体类型和相应的结构体指针类型,解决了现有MSVL中数据类型单一,应用范围窄的问题,使得MSVL可用于相对复杂的多数据类型系统的建模、仿真和验证。51INTCL权利要求书5页说明书16页附图2页19中华人民共和国国家知识产权局12发明专利申请权利要求书5页说明书16页附图2页10申请公布号CN104182216ACN104182216A1/5页21MSVL中结构体以及结。
3、构体指针类型的扩展解释系统,其特征在于,所述系统包括如下模块结构体类型定义模块所述结构体类型定义模块包括结构体类型的定义;结构体变量定义声明模块所述结构体变量定义声明模块包括变量声明命令以及类型声明定义;结构体变量存储模块所述结构体变量存储模块包含有变量类型标记和变量取值,所述变量类型标记根据变量声明语句记录变量的类型,变量存储两边的取值限制在其类型所对应的论域内;结构体及结构体指针类型赋值操作处理模块赋值操作的左操作数为变量,右操作数为表达式并对左操作数进行解释。2一种根据权利要求1的MSVL中结构体以及结构体指针类型的扩展方法,其特征在于,所述方法包括如下步骤步骤1,对于MSVL中的基本数。
4、据类型引入指针类型;步骤2,在指针类型的基础上引入结构体类型,扩展出结构体及结构体指针类型;通过所述结构体类型定义模块,并结合结构体类型定义的条件,给出正确的结构体类型定义;步骤3,通过所述结构体变量定义声明模块,用MSVL中的类型声明语句定义结构体变量,并声明所述结构体以及结构体指针类型;步骤4,通过所述结构体变量存储模块,根据所述结构体变量所声明的类型及其语义,将所述结构体变量保存在MSVL符号表中;步骤5,在所述结构体及结构体指针类型赋值操作处理模块中对所述结构体以及结构体指针类型进行赋值操作。3根据权利要求2所述的MSVL中结构体以及结构体指针类型的扩展方法,其特征在于,所述步骤1中在。
5、基本数据类型中引入指针类型具体流程如下步骤11,所述基本数据类型集合用表示,其中包括原始数据类型INTFLOATCHAR、列表类型INTFLOATCHAR、数组类型INTFLOATCHAR,则给定数组长度的基本数据类型集合用表示,定义如下INT1,INT2,FLOAT1,FLOAT2,CHAR1,CHAR2,;并给出所述基本数据类型的论域FLOATCHARCHARCHAR;其中权利要求书CN104182216A2/5页3步骤12,用IST定义表示一种基本数据类型T,从而得到类型声明公式其中步骤13,定义一个解释IE来表示变量E类型化的值,其中,NIL表示变量还未定义;步骤14,对于每一种基本数。
6、据类型,引入指针类型,记作T,而指针类型的集合用表示;指针类型的解释需要一个合适的地址模型,因此把指针T解释为X,INT,表示指针T指向变量X,而T解释为X;步骤15,定义指针类型的论域如下其中,代表所有变量名的集合,NULL是一个空指针;如果指针T为空指针,T的解释ITNULL,T,否则ITX,T;步骤16,定义指针的基本操作引用和解引用如下步骤17,在基本数据类型,已经定义用IST来表示一种T类型,现在把指针类型扩展进去;对于每一个定义如下并且其中,是BOOL类型,上式解释为,如果变量V是T类型,则为TRUE,否则为FALSE;步骤18,如下定义指针类型变量的声明权利要求书CN104182。
7、216A3/5页4其中,4根据权利要求2所述的MSVL中结构体以及结构体指针类型的扩展方法,其特征在于,所述步骤2中具体流程如下步骤21,在指针类型的基础上引入结构体类型,用S表示结构体类型,表示一个可数的结构体类型集合,则有对每一种结构体类型,用S表示结构体类型S的指针类型,则所述结构体类型中指针类型的集合为步骤22,初步定义结构体类型为STRUCTST1A1,TKAK;其中表示除去,为所有变量名的集合,所述结构体类型S中的每一个成员AK分别对应类型TK;步骤23,定义好一个结构体类型S之后,用SX来声明一个新的结构体变量,这样X就拥有的所有成员类型,用XA来表示的每一个成员;定义一个结构体。
8、指针类型ST其中用TA来指向结构体类型的成员A;如果结构体指针类型ST为空指针,把T解释为NULL,S,否则,把T解释为X,S;结构体指针类型的论域定义如下步骤24,结构体类型的论域定义如下可以得出为一个嵌套的二元组,其中FPFE1,E2表示从集合E1到集合E2所有的有限偏函数,如下定义FPF其中,E是有限的,并且如果U,V,U,VE,那么VV,即U和V是一一对应的;步骤25,对于基本数据类型和指针类型有现在对其进行扩展,把结构体类型引入就得到并且对于每一个都有并且步骤26,引入系统变量HEALTHY,所述系统变量HEALTHY为字符类型变量;所述变量HEALTHY只有Y和N两个值,默认值为Y。
9、,在一些坏情况下设置为N;步骤27,对于每一个结构体类型S,引入RS表示它是否定义过结构体S一旦定义,RS就一直保持是TRUE,只有S未定义前是FALSE;如果STRUCTST1A1,TKAK是不合法的,那么在当前状态为FALSE,并且把变量HEALTHY的值设置为N;步骤28,在结构体变量X拥有结构体类型S同样的成员以及类型时,则认为结构体变量X和结构体类型S是一致的,即权利要求书CN104182216A4/5页5当结构体类型S定义为STRUCTST1A1,TKAK时,X被解释为其中步骤29,为了确保结构体变量及其成员的一致性,在结构体变量定义时记录它每个成员的信息,然后用来限制每一个结构体。
10、变量,因此引入一个系统变量MEMS,定义为这样得到一个特殊类型其中MEMTYPE是用来记录结构体每个成员的信息;步骤210,得出结构体类型S的最终定义其中当K0时,A1,T1,AKTK是空集5根据权利要求2所述的MSVL中结构体以及结构体指针类型的扩展方法,其特征在于,所述步骤3的具体流程为步骤31,所述结构体变量定义为一个嵌套的二元组;步骤32,为了检查结构体变量和定义的一致性,定义一个断言CONS用CONSX,MEMS表示一致;对于每一个并且A1,T1,AKTKMEMTYPE,都有并且当且定当有步骤33,结合所述系统变量HEALTHY给出结构体以及结构体指针类型的声明如下如果一个结构体变量。
11、声明SX是合法的,一旦它被定义,RS就会一直保持,用ISSXCONSX,MEMS来确保生成结构体变量X的类型和值和结构体类型S保持一致;如果因为结构体类型S没有定义而导致SX和SX不合法,那么在当前状态下RS为FALSE,并且系统变量HEALTHY设置为N。6根据权利要求2所述的MSVL结构体以及结构体指针类型的扩展方法,其特征在于,所述步骤5中对结构体指针类型的赋值操作步骤如下对于赋值操作的执行,流程如下步骤511,查找符号表,查看变量X是否存在,如果存在,执行步骤512,否则执行步骤515;步骤512,查找符号表,查看T是否为结构体指针类型,如果是,执行步骤513,否则执行步骤515;权利。
12、要求书CN104182216A5/5页6步骤513,判断X的类型和结构体指针T的类型是否相等,如果是,执行步骤514,否则执行步骤515;步骤514,执行操作TX;步骤515,ITIX,向用户提示TX不满足;对于赋值操作XT的执行,流程如下步骤521,查找符号表,看变量X是否在存在,如果存在,执行步骤522,否则执行步骤525;步骤522,在符号表中查找T,首先看T是否是一个结构体指针类型,如果是,然后再看T的取值是否为数据域中的一个常量,如果是,执行步骤523,否则执行步骤525;步骤523,对变量X的取值进行判断,如果变量X的取值为NIL时,将T的取值赋给X使得XT等式满足,赋值操作执行成。
13、功,否则执行步骤524;步骤524,如果X的取值不是NIL,判断X的取值是否等于T的取值,如果相等,那么等式满足,赋值操作执行成功,赋值操作流程结束,如果取值不相等,执行步骤525;步骤525,IXIT,向用户提示XT不满足。7根据权利要求2所述的MSVL中结构体以及结构体指针类型的扩展方法,其特征在于,所述步骤5中的结构体类型的赋值操作步骤如下对于赋值操作XSA的执行,流程如下步骤531,查找符号表,看变量X是否存在,如果存在,执行步骤532,否则执行步骤535;步骤532,查找符号表,检查变量S是否为结构体类型,如果是,执行步骤533,否则执行步骤535;步骤533,遍历结构体类型S的存储。
14、链表,找出成员A所在项,如果查找成功,执行步骤534,否则执行步骤535;步骤534,执行操作XSA;步骤535,IXISA,向用户提示XSA不满足;对于赋值操作XTA的执行,流程如下步骤541,查找符号表,看变量是否存在,如果存在,执行步骤542,否则执行步骤546;步骤542,查找符号表,看T是否为结构体指针类型,如果是,执行步骤543,否则执行步骤546;步骤543,查找符号表,看T所指的变量是否为结构体类型,如果是,执行步骤544,否则执行步骤546;步骤544,遍历T所指的结构体的存储链表,找出成员A所在项,如果查找成功,执行步骤545,否则执行步骤546;步骤545,执行操作XTA。
15、;步骤546,XTA,向用户提示XTA不满足。权利要求书CN104182216A1/16页7MSVL中结构体以及结构体指针类型的扩展解释系统及其扩展方法技术领域0001本发明属于计算机系统形式化建模与验证技术领域,主要涉及一种MSVL中结构体以及结构体指针类型的扩展解释系统及其扩展方法。背景技术0002在诸如数字电路和软件工程等形式化验证领域,时序逻辑已经逐渐成为描述和推理并发系统性质的有效工具。投影时序逻辑PTL扩展了区间时序逻辑ITL,并且被广泛运用于系统说明和验证中。大多数情况下,系统建模技术和时序逻辑无关,但是系统所期望的性质却是用时序逻辑公式来描述的。所以,就导致了系统验证出现这样一。
16、个问题,系统建模和性质描述采用了不同的形式化方法,而不同的形式化方法有不同的表达式和语义,于是就容易造成混淆。为了改善这一现状,可以用同一种时序逻辑语言对系统进行建模和性质描述。MSVL是一种用于建模、仿真和验证程序的投影时序逻辑程序设计语言,它是PTL的一个可执行子集。我们可以用MSVL程序来对一个系统建模,并且用命题投影时序逻辑PPTL公式来描述该系统的性质,最终在同一个时序逻辑框架下进行模型检测,来验证系统所期望的性质是否满足。0003在编程语言中引入类型是很重要的,它可以让程序员写出更加合理和实用的程序,众所周知,大多数传统编程语言,例如C和JAVA都有自己的数据类型,包括整型、数组、。
17、列表、指针和结构体等等。同样地,在时序逻辑编程语言中引入这些类型也是非常重要的,这样程序员不但可以写出更加合理和实用的程序,并且可以用来验证包含复杂类型的系统。但是,现在大多数时序逻辑语言,例如TLA和METATEM都还不支持类型。在TLA中,TLA规范语言和PLUSCAL算法语言本质上是无类型的,其中类型正确性被简单地当作一个不变量,可以用TLC来验证。METATEM是一个面向代理的编程语言,它的类型仅仅适用于代理,用来确保确定的行为规范是满足的。这些语言中的类型概念和传统语言中变量或者表达式的类型概念大不相同。研究投影时序逻辑语言实现类型的技术,尤其是MSVL语言中的类型实现,可以大大缩小。
18、投影时序逻辑语言和传统语言之间的差距。0004目前,在MSVL中已经有了基本数据类型,包括整型、浮点型、字符型、字符串型和基本指针类型,但是,只有基本数据类型和指针类型不足以对一些复杂数据系统进行建模、仿真和验证。为此,本发明在MSVL基本数据类型和指针类型的基础上扩展了结构体以及相应的结构体指针类型,使得MSVL的数据类型更加完整,可以运用在数据类型更加复杂的系统中,随着类型的发展,现在可以把更多的C程序翻译成类型化的MSVL程序,并且可以在MSVL解释器工具中进行建模、仿真和验证。发明内容0005针对现有技术的不足,本发明旨在提供一种MSVL中结构体及结构体指针类型的扩展解释系统及其扩展方。
19、法,在MVSL基本数据类型和指针类型的基础上,扩展结构体以及说明书CN104182216A2/16页8结构体指针类型,使得MSVL可以运用在包含更加复杂的数据类型的系统中,对系统进行建模、仿真和验证,也使得MSVL和传统编程语言之间的差距减小,使得MSVL更加的实用。0006为了实现上述目的,本发明采用如下技术方案0007MSVL中结构体及结构体指针类型的扩展解释系统,包括如下模块0008结构体类型定义模块所述结构体类型定义模块包括结构体类型的定义;0009结构体变量定义声明模块所述变量定义声明模块包括所述变量声明命令以及类型声明定义;0010结构体变量存储模块所述变量存储模块包含有变量类型标。
20、记和变量取值,所述变量类型标记根据变量声明语句记录该变量的类型,变量存储两边的取值限制在其类型所对应的论域内;0011结构体及结构体指针类型赋值操作处理模块赋值操作的左操作数为变量,右操作数为表达式并对左操作数进行解释。0012一种基于上述系统的MSVL中结构体及结构体指针类型的扩展方法,具体包括如下步骤0013步骤1,对于MSVL中的基本数据类型引入指针类型;所述MSVL中的基本数据类型包括整型、浮点型、字符型、字符串型;0014步骤2,在指针类型的基础上,引入结构体类型,扩展出结构体及结构体指针类型;通过所述结构体类型定义模块,并结合结构体类型定义的条件,给出正确的结构体类型定义;0015。
21、步骤3,通过所述结构体变量定义声明模块,用MSVL中的类型声明语句定义结构体变量,并声明所述结构体类型以及结构体指针类型;引入类型后,每个变量都是先声明再引用,声明规定了变量的类型,这样在其他语句中引用时,可以直接对变量进行解释获取变量的值的类型,从而提高程序执行的效率。0016步骤4,通过所述结构体变量存储模块,根据所述结构体变量所声明的类型及其语义,将所述结构体变量保存在MSVL符号表中,所述MSVL符号表为存放MSVL变量的表;0017步骤5,在所述结构体及结构体指针类型赋值操作处理模块中对所述结构体类型以及结构体指针类型进行赋值操作。0018需要说明的是,所述步骤1中在基本数据类型中引。
22、入指针类型具体流程如下0019步骤11,所述基本数据类型集合用表示,其中包括原始数据类型INTFLOATCHAR、列表类型INTFLOATCHAR、数组类型INTFLOATCHAR;由于在类型声明时,定义一个数组需要给定数组长度,比如INTA5,因此给定数组长度后的基本数据类型的集合用表示,定义如下00200021INT1,INT2,FLOAT1,FLOAT2,CHAR1,CHAR2,;0022并给出所述基本数据类型的论域0023说明书CN104182216A3/16页90024FLOATCHARCHARCHAR;0025其中00260027步骤12,用IST定义表示一种基本数据类型,其中从而。
23、可以得到类型声明公式00280029步骤13,定义一个解释IE来表示变量E类型化的值,其中NIL表示变量还未定义;0030例如I88,INT,I,CHAR。0031步骤14,对于每一种基本数据类型,引入指针类型,记作T,而指针类型的集合用表示;0032指针类型的解释需要一个合适的地址模型,因此把指针T解释为X,INT,表示指针T指向变量X,而T解释为X;0033步骤15,定义指针类型的论域如下00340035其中,代表所有变量名的集合,NULL是一个空指针;如果指针T为空指针,T的解释ITNULL,T,否则ITX,T;0036步骤16,定义指针的基本操作引用和解引用如下0037说明书CN104。
24、182216A4/16页100038空指针在程序中是非常有用的,所以MSVL中,也允许NULLT在程序中出现,其中因为每一个表达式要有确定的类型,所以下标T一般情况不能省略。只有在省略后不引起歧义的情况下才可以省略;0039例如T1和T2分别代表INT和CHAR那么公式T1NULLINTT2NULLCHAR可以简写为T1NULLT2NULL,这样我们不可能误以为是T1T2。0040步骤17,在基本数据类型,已经定义用IST来表示一种T类型,现在把指针类型扩展进去;对于每一个指针类型,定义如下0041并且0042其中,是BOOL类型,上式解释为,如果变量V是T类型,则为TRUE,否则为FALSE。
25、;0043步骤18,如下定义指针类型变量的声明00440045其中,0046示例说明0047如图2所示,用指针实现三个整数从大到小的排序。0048示例代码0049FUNCTIONSWAPINTP1,INTP20050/SWAPTWOVARIABLESUSINGPOINTERS0051FRAMENANDINTNANDSKIP;0052NP1;P1P2;P2N;0053FRAMEN1,N2,N3,P1,P2,P3AND0054INTN1,N2,N3ANDSKIP;0055INTP1,P2,P3ANDSKIP;0056INPUTN1,N2,N3ANDSKIP;0057P1N1;P2N2;P3N3;0。
26、058IFN1N2THENSWAPP1,P2ELSESKIP;0059IFN2N3THENSWAPP2,P3ELSESKIP;0060IFN1N3THENSWAPP1,P3ELSESKIP;0061需要说明的是,所述步骤2中具体流程如下0062步骤21,在指针类型的基础上引入结构体类型,用S表示结构体类型,表示一个可数的结构体类型集合,则有对每一种结构体类型,用S表示结构体类型S的指针类型,则所述结构体中指针类型的集合为0063步骤22,初步定义结构体为0064STRUCTST1A1,TKAK;0065其中表示除去,为所有变量名的说明书CN104182216A105/16页11集合,为基本数据。
27、类型的集合,为指针类型的集合;所述结构体类型S中的每一个成员AK分别对应类型TK;0066为了简化这个理论,不允许结构体嵌套,但是允许一个结构体成员的指针指向另一个结构体类型。这样,就可以容易地定义链表、树和图等复杂数据类型。0067步骤23,一旦定义好一个结构体类型S,就可以用SX来声明一个新的结构体类型变量,因此X就拥有的所有成员类型,可以用XA来表示的每一个成员;同样还可以定义一个结构体指针类型ST,其中用TA来指向结构体的成员A,结构体指针类型ST为空指针,把T解释为NULL,S,否则,把T解释为X,S;综上所述,结构体指针类型的论域定义如下00680069步骤24,结构体类型定义为S。
28、TRUCTST1A1,TKAK,对于每一个类型的变量X把它解释为其中对于X的论域其实就是它每一个成员变量论域的集合,其中涉及到基本数据类型域指针类型域或者结构体指针类型域综上所述,结构体类型的论域定义如下00700071可以得出为一个嵌套的二元组,其中FPFE1,E2表示从集合E1到集合E2所有的有限偏函数,如下定义FPF00720073其中,E是有限的,并且如果U,V,U,VE,那么VV,即U和V是一一对应的;0074结构体的基本操作是结构体成员的存取。对每一个成员A表示结构体成员的名字。定义“A”来进行成员的存取操作。例如假定E是一个结构体类型,而A是它的一个成员,那么EA就返回成员A。0。
29、075所以,就有了如下定义00760077之前在指针类型部分定义过一般指针的引用和解引用操作,对于结构体指针类型同样适用。例如假定T是一个指向结构体A的结构体指针类型,用TA就可以返回A。0078所以,就有了如下定义0079说明书CN104182216A116/16页120080和基本数据类型指针一样,在程序中我们也允许结构体指针类型为空,表示为NULLT,其中0081结合之前的基本数据类型指针,我们可以把NULLT解释为NULL,T,其中,同样的,当下标T省略不会引起歧义时可以省略。0082步骤25,对于基本数据类型和指针类型有现在对其进行扩展,把结构体类型引入就得到并且对于每一个都有008。
30、3并且0084步骤26,由于结构体类型的复杂性,用逻辑公式来进行结构体的形式化定义和变量声明并不是一件容易的事,所以不得不考虑一些细节问题0085首先,要考虑结构体类型定义不合法的可能性。用下面的定义00860087来声明结构体S的成员。这种情况下,规定如果SI1IM的定义不迟于结构体S的定义,结构体S的定义就是合法的。否则,就不合法。0088例如在程序STRUCTS1INTASTRUCTS2S1A2中,S1在S2之前定义,所以S2是合法的。另外一个程序STRUCTS1S2ASTRUCTS2S1A2中,因为S1和S2是同时定义的,所以也是合法的。对于如何处理不合法的结构体类型定义,一种自然的想。
31、法就是让包含有不合法结构体类型定义的不健康程序不可满足,也就是说该程序不合法。0089但是,这种方法不可行。对于程序STRUCTS2S1A2来说,它本身就是不健康的程序,也就是说如果STRUCTS2S1A2是不满足的,那么STRUCTS1S2A1STRUCTS2S1A2也就是不满足的,但是实际又是满足的,这就产生了矛盾。0090为了解决这个矛盾,引入系统变量HEALTHY,所述系统变量HEALTHY为字符类型变量;所述变量HEALTHY只有Y和N两个值,默认值为YYES,在一些坏情况下设置为NNO;由于不允许在程序中出现一个显示的系统变量,所以要求程序员不能修改HEALTHY变量的值。为了处理。
32、这些不健康的程序,充分利用系统变量HEALTHY重新规范地定义结构体如下00910092其中0093步骤27,对于每一个结构体类型S,引入RS表示它是否定义过结构体类型S一旦定义,RS就一直保持是TRUE,只有S未定义前是FALSE;这是因为遵循MSVL极小模型语义的规则。在极小模型语义中,一个命题独立于其他命题可以为真,也可以为假时,它被解释为FALSE;如果STRUCTST1A1,TKAK是不合法的,那么在当前状态为FALSE,并且把变量HEALTHY的值设置为N;0094步骤28,在结构体变量X拥有结构体类型S同样的成员以及类型时,则认为结构体变量X和结构体类型S是一致的,即说明书CN1。
33、04182216A127/16页130095当结构体S定义为STRUCTST1A1,TKAK时,X被解释为其中0096步骤29,为了确保结构体变量及其成员的一致性,在结构体变量定义时记录它每个成员的信息,然后用来限制每一个结构体变量,因此引入一个系统变量MEMS定义为00970098这样得到一个特殊类型00990100其中MEMTYPE是用来记录结构体每个成员的信息;0101步骤210,得出结构体S的最终定义01020103其中,当K0时,A1,T1,AKTK是空集0104需要说明的是,所述步骤3的具体流程为0105步骤31,所述结构体变量定义为一个嵌套的二元组;0106步骤32,为了检查结构。
34、体变量和定义的一致性,定义一个断言CONS用CONSX,MEMS表示一致;对于每一个并且A1,T1,AKTKMEMTYPE,都有0107并且0108当且定当有0109步骤33,结合所述变量HEALTHY给出结构体类型以及结构体指针类型的声明如下011001110112如果一个结构体变量声明SX是合法的,一旦它被定义,RS就会一直保持,用ISSXCONSX,MEMS来确保生成结构体变量X的类型和值和结构体类型S保持一致;如果因为结构体类型S没有定义而导致SX和SX不合法,那么在当前状态下RS为FALSE,并且系统变量HEALTHY设置为N。0113如图3所示,给出一个链表逆置的例子,示例代码如下。
35、说明书CN104182216A138/16页140114STRUCTNODEINTDATAANDNODENEXTS;0115FRAMES1,S2,S3,P,Q,RAND0116/VARIABLEINITIALIZATION0117NODES1,S2,S3ANDSKIP;0118/BUILDTHELINKEDLIST0119S1DATA10;S1NEXTSS2;0120S2DATA20;S2NEXTSS3;0121S3DATA30;S3NEXTSNULL;0122/POINTERINITIALIZATION0123NODEP,Q,RANDSKIP;0124PS1;QNULL;0125/INPLA。
36、CEREVERSETHELINKEDLIST0126WHILEPNULL0127RPNEXTS;PNEXTSQ;QP;PR0128需要说明的是,所述步骤5中对结构体指针类型的赋值操作步骤如下0129对于赋值操作TX的执行,流程如下0130步骤511,查找符号表,查看变量X是否存在,如果存在,执行步骤512,否则执行步骤515;0131步骤512,查找符号表,查看T是否为结构体指针类型,如果是,执行步骤513,否则执行步骤515;0132步骤513,判断X的类型和结构体指针T类型是否相等,如果是,执行步骤514,否则执行步骤515;0133步骤514,执行操作TX;0134步骤515,ITIX,。
37、向用户提示TX不满足。0135对于赋值操作XT的执行,流程如下0136步骤521,查找符号表,看变量X是否存在,如果存在,执行步骤522,否则执行步骤525;0137步骤522,在符号表中查找T,首先看T是否是一个结构体指针类型,如果是,然后再看T的取值是否为数据域中的一个常量,如果是,执行步骤523,否则执行步骤525;0138步骤523,对变量X的取值进行判断,如果变量X的取值为NIL时,将T的取值赋给X,使得XT等式满足,赋值操作执行成功,否则执行步骤524;0139步骤524,如果X的取值不是NIL,判断X的取值是否等于T的取值,如果相等,那么等式满足,赋值操作执行成功,赋值操作流程结。
38、束,如果取值不相等,执行步骤525;0140步骤525,IXIT,向用户提示XT不满足。0141需要说明的是,所述步骤5中的结构体类型的赋值操作步骤如下0142对于赋值操作XSA的执行,流程如下0143步骤531,查找符号表,看变量X是否存在,如果存在,执行步骤532,否则执行步骤535;说明书CN104182216A149/16页150144步骤532,查找符号表,检查变量S是否为结构体类型,如果是,执行步骤533,否则执行步骤535;0145步骤533,遍历结构体S的存储链表,找出成员A所在项,如果查找成功,执行步骤534,否则执行步骤535;0146步骤534,执行操作XSA;0147步。
39、骤535,IXISA,向用户提示XSA不满足。0148对于赋值操作XTA的执行,流程如下0149步骤541,查找符号表,看变量X是否存在,如果存在,执行步骤542,否则执行步骤546;0150步骤542,查找符号表,看T是否为结构体指针类型,如果是,执行步骤543,否则执行步骤546;0151步骤543,查找符号表,看T所指的变量是都为结构体类型,如果是,执行步骤544,否则执行步骤546;0152步骤544,遍历T所指的结构体的存储链表,找出成员A所在项,如果查找成功,执行步骤545,否则执行步骤546;0153步骤545,执行操作XTA;0154步骤546,IXITA,向用户提示XTA不满。
40、足。0155本发明的有益效果在于本发明在MVSL基本数据类型和指针类型的基础上,扩展结构体以及结构体指针类型,使得MSVL可以运用在包含更加复杂的数据类型的系统中,对系统进行建模、仿真和验证,也使得MSVL和传统编程语言之间的差距减小,使得MSVL更加的实用。附图说明0156图1为本发明的系统模块构成示意图;0157图2为用指针实现三个整数从大到小排序示例示意图;0158图3为链表逆置示例示意图。具体实施方式0159以下将结合附图对本发明作进一步的描述,需要说明的是,本实例以本技术方案为前提,给出了具体的实施方式,但并不限于本实施例。0160如图1所示,MSVL中结构体及结构体指针类型的扩展解。
41、释系统及其扩展方法,所述系统包括如下模块0161结构体类型定义模块所述结构体类型定义模块包括结构体类型的定义;0162结构体变量定义声明模块所述变量定义声明模块包括所述变量声明命令以及类型声明定义;0163结构体变量存储模块所述变量存储模块包含有变量类型标记和变量取值,所述变量类型标记根据变量声明语句记录该变量的类型,变量存储两边的取值限制在其类型所对应的论域内;0164结构体及结构体指针类型赋值操作处理模块赋值操作的左操作数为变量,右操说明书CN104182216A1510/16页16作数为表达式并对左操作数进行解释。0165基于上述系统的MSVL中结构体以及结构体指针类型的扩展方法,实施步。
42、骤如下01661、基本数据类型集合用表示,包括0167原始数据类型INTFLOATCHAR0168列表类型INTFLOATCHAR0169数组类型INTFLOATCHAR01702、由于在类型声明时,定义一个数组需要给定数组长度,比如INTA5。所以修改基本数据类型集合为01710172INT1,INT2,FLOAT1,FLOAT2,CHAR1,CHAR2,01733、基本数据类型论域用表示,01740175FLOATCHARCHARCHAR0176其中,017701784、用IST定义表示一种数据类型,其中从而可以得到类型声明公式017901805、定义一个解释IE来表示变量E类型化的值,其。
43、中NIL表示变量还未定义。0181例如I88,INT,I,CHAR。01826、对于每一种数据类型,引入指针类型,记作T,而指针类型的集合用表示;01837、指针类型的解释需要一个合适的地址模型。一种可能性就是把地址模型当作是说明书CN104182216A1611/16页17位置到值得映射,这种情况下,用”X”符号来取得变量X的地址。但是这种方法不够抽象,因为这依赖一些例如具体内存地址的实现细节。为了使得实现更加灵活,可以把指针T解释为X,INT,表示指针T指向变量X,而T解释为X。01848、定义指针类型的论域其中,代表所有变量名的集合,NULL是一个空指针。01859、如果T为空指针,T的。
44、解释ITNULL,T,否则ITX,T。018610、指针的基本操作是引用和解引用。定义如下0187018811、空指针在程序中是非常有用的,所以MSVL中,也允许NULLT在程序中出现;其中因为每一个表达式要有确定的类型,所以下标T一般情况不能省略。只有在省略后不引起歧义的情况下才可以省略;0189例如T1和T2分别代表INT和CHAR,那么公式T1NULLINTT2NULLCHAR可以简写为T1NULLT2NULL,这样我们不可能误以为是T1T2。019012、在基本数据类型,已经定义用IST来表示一种T类型。现在把指针类型扩展进去。019113、把指针类型扩展进去;对于每一个指针类型,定义。
45、如下0192并且0193其中,是BOOL类型,上式解释为,如果变量V是T类型,则为TRUE,否则为FALSE;019414、如下定义指针类型变量的声明01950196其中,019715、在指针类型的基础上,在MSVL中引入结构体STRUCT类型,用S表示,表示一个可数的结构体类型集合,即对每一种结构体类型,用S来表示结构体S的指针类型,因此,所述结构体中指针类型的集合可以表示为0198用来表示基本数据类型、指针类型、结构体类型和与之相关联的指针类型的集合。这样,就可以如下定义结构体0199STRUCTST1A1,TKAK0200其中表示除去;说明书CN104182216A1712/16页180。
46、201这样就定义了一个结构体S,它的每一个成员AK分别对应类型TK。0202为了简化这个理论,不允许结构体嵌套,但是允许一个结构体成员的指针指向另一个结构体类型。这样,就可以容易地定义链表、树和图等复杂数据类型。020316、一旦定义好一个结构体类型S,就可以用SX来声明一个新的结构体类型变量。所以,X就拥有的所有成员类型,可以用XA来表示的每一个成员。同样还可以定义一个结构体指针类型ST,用TA来指向结构体类型的成员A。020417、结构体指针类型论域和其他类型指针一样,定义一个结构体指针类型如果为空指针,把T解释为NULL,S。否则,把T解释为X,S。0205综上所述,结构体指针类型的论域。
47、可以如下定义0206020718、结构体论域结构体类型定义为STRUCTST1A1,TKAK,对于每一个类型的变量X把它解释为其中所以,对于X的论域其实就是它每一个成员变量论域的集合,其中涉及到基本数据类型域指针类型域或者结构体指针类型域0208综上所述,结构体类型的论域可以如下定义02090210可以得出为一个嵌套的二元组。其中,FPFE1,E2表示从集合E1到集合E2所有的有限偏函数。如下定义FPF02110212其中,E是有限的,并且如果U,V,U,VE,那么VV,即U和V是一一对应的。021319、结构体的操作结构体的基本操作是结构体成员的存取。对每一个成贝A表示结构体成员的名字。定义。
48、“A”来进行成员的存取操作。假定E是一个结构体类型,而A是它的一个成员,那么EA就返回成员A。0214所以,就有了如下定义0215021620、之前在指针类型部分定义过一般指针的引用和解引用操作,对于结构体指针类型同样适用。假定T是一个指向结构体类型A结体指针类型,用TA就可以返回A。0217所以,就有了如下定义0218说明书CN104182216A1813/16页19021921、和基本数据类型指针一样,在程序中我们也允许结构体指针类型为空,表示为NULLT,其中0220结合之前的基本数据类型指针,我们可以把NULLT解释为NULL,T,其中,同样的,当下标T省略不会引起歧义时可以省略。02。
49、2122、之前已经定义过用IST表示一种T类型。对于基本数据类型和指针类型有现在对其进行扩展,把结构体类型引入就得到并且对于每一个都有0222并且022323、由于结构体类型的复杂性,用逻辑公式来进行结构体的形式化定义和变量声明并不是一件容易的事,所以不得不考虑一些细节问题0224首先,要考虑结构体类型定义不合法的可能性。用下面的定义02250226来声明结构体S的成员。这种情况下,规定如果SI1IM的定义不迟于结构体S的定义,结构体S的定义就是合法的。否则,就不合法。0227例如在程序STRUCTS1INTASTRUCTS2S1A2中,S1在S2之前定义,所以S2是合法的。另外一个程序STRUCTS1S2ASTRUCTS2S1A2中,因为S1和S2是同时定义的,所以也是合法的。0228对于如何处理不合法的结构体类型定义,。