Msvl中结构体以及结构体指针类型的扩展解释系统及其扩展方法

文档序号:6620056阅读:332来源:国知局
Msvl中结构体以及结构体指针类型的扩展解释系统及其扩展方法
【专利摘要】本发明公开了一种MSVL中结构体以及结构体指针类型的扩展解释系统,具体包括结构体类型定义模块、结构体变量定义声明模块、结构体变量存储模块和结构体及结构体指针类型赋值操作处理模块;在该系统的基础上,还公开了一种MSVL中结构体以及结构体指针类型的扩展方法,该方法在MSVL基本数据类型(包括整型、浮点型、字符型、字符串型)和指针类型的基础之上扩展了结构体类型和相应的结构体指针类型,解决了现有MSVL中数据类型单一,应用范围窄的问题,使得MSVL可用于相对复杂的多数据类型系统的建模、仿真和验证。
【专利说明】MSVL中结构体以及结构体指针类型的扩展解释系统及其扩展方法

【技术领域】
[0001]本发明属于计算机系统形式化建模与验证【技术领域】,主要涉及一种MSVL中结构体以及结构体指针类型的扩展解释系统及其扩展方法。

【背景技术】
[0002]在诸如数字电路和软件工程等形式化验证领域,时序逻辑已经逐渐成为描述和推理并发系统性质的有效工具。投影时序逻辑(PTL)扩展了区间时序逻辑(ITL),并且被广泛运用于系统说明和验证中。大多数情况下,系统建模技术和时序逻辑无关,但是系统所期望的性质却是用时序逻辑公式来描述的。所以,就导致了系统验证出现这样一个问题,系统建模和性质描述采用了不同的形式化方法,而不同的形式化方法有不同的表达式和语义,于是就容易造成混淆。为了改善这一现状,可以用同一种时序逻辑语言对系统进行建模和性质描述。MSVL是一种用于建模、仿真和验证程序的投影时序逻辑程序设计语言,它是PTL的一个可执行子集。我们可以用MSVL程序来对一个系统建模,并且用命题投影时序逻辑(PPTL)公式来描述该系统的性质,最终在同一个时序逻辑框架下进行模型检测,来验证系统所期望的性质是否满足。
[0003]在编程语言中引入类型是很重要的,它可以让程序员写出更加合理和实用的程序,众所周知,大多数传统编程语言,例如C和Java都有自己的数据类型,包括整型、数组、列表、指针和结构体等等。同样地,在时序逻辑编程语言中引入这些类型也是非常重要的,这样程序员不但可以写出更加合理和实用的程序,并且可以用来验证包含复杂类型的系统。但是,现在大多数时序逻辑语言,例如TLA和METATEM都还不支持类型。在TLA中,TLA+规范语言和PlusCal算法语言本质上是无类型的,其中类型正确性被简单地当作一个不变量,可以用TLC来验证。METATEM是一个面向代理的编程语言,它的类型仅仅适用于代理,用来确保确定的行为规范是满足的。这些语言中的类型概念和传统语言中变量或者表达式的类型概念大不相同。研究投影时序逻辑语言实现类型的技术,尤其是MSVL语言中的类型实现,可以大大缩小投影时序逻辑语言和传统语言之间的差距。
[0004]目前,在MSVL中已经有了基本数据类型,包括整型、浮点型、字符型、字符串型和基本指针类型,但是,只有基本数据类型和指针类型不足以对一些复杂数据系统进行建模、仿真和验证。为此,本发明在MSVL基本数据类型和指针类型的基础上扩展了结构体以及相应的结构体指针类型,使得MSVL的数据类型更加完整,可以运用在数据类型更加复杂的系统中,随着类型的发展,现在可以把更多的C程序翻译成类型化的MSVL程序,并且可以在MSVL解释器工具中进行建模、仿真和验证。


【发明内容】

[0005]针对现有技术的不足,本发明旨在提供一种MSVL中结构体及结构体指针类型的扩展解释系统及其扩展方法,在MVSL基本数据类型和指针类型的基础上,扩展结构体以及结构体指针类型,使得MSVL可以运用在包含更加复杂的数据类型的系统中,对系统进行建模、仿真和验证,也使得MSVL和传统编程语言之间的差距减小,使得MSVL更加的实用。
[0006]为了实现上述目的,本发明采用如下技术方案:
[0007]MSVL中结构体及结构体指针类型的扩展解释系统,包括如下模块:
[0008]结构体类型定义模块:所述结构体类型定义模块包括结构体类型的定义;
[0009]结构体变量定义声明模块:所述变量定义声明模块包括所述变量声明命令以及类型声明定义;
[0010]结构体变量存储模块:所述变量存储模块包含有变量类型标记和变量取值,所述变量类型标记根据变量声明语句记录该变量的类型,变量存储两边的取值限制在其类型所对应的论域内;
[0011]结构体及结构体指针类型赋值操作处理模块:赋值操作的左操作数为变量,右操作数为表达式并对左操作数进行解释。
[0012]一种基于上述系统的MSVL中结构体及结构体指针类型的扩展方法,具体包括如下步骤:
[0013]步骤1,对于MSVL中的基本数据类型引入指针类型;所述MSVL中的基本数据类型包括整型、浮点型、字符型、字符串型;
[0014]步骤2,在指针类型的基础上,引入结构体类型,扩展出结构体及结构体指针类型;通过所述结构体类型定义模块,并结合结构体类型定义的条件,给出正确的结构体类型定义;
[0015]步骤3,通过所述结构体变量定义声明模块,用MSVL中的类型声明语句定义结构体变量,并声明所述结构体类型以及结构体指针类型;引入类型后,每个变量都是先声明再引用,声明规定了变量的类型,这样在其他语句中引用时,可以直接对变量进行解释获取变量的值的类型,从而提高程序执行的效率。
[0016]步骤4,通过所述结构体变量存储模块,根据所述结构体变量所声明的类型及其语义,将所述结构体变量保存在MSVL符号表中,所述MSVL符号表为存放MSVL变量的表;
[0017]步骤5,在所述结构体及结构体指针类型赋值操作处理模块中对所述结构体类型以及结构体指针类型进行赋值操作。
[0018]需要说明的是,所述步骤I中在基本数据类型中引入指针类型具体流程如下:
[0019]步骤1.1,所述基本数据类型集合用^表示,其中包括原始数据类型int floatchar、列表类型int〈>float〈>char〈>、数组类型int [] float [] char [];由于在类型声明时,定义一个数组需要给定数组长度,比如:int[a]5,因此给定数组长度后的基本数据类型的集合用没1表示,定义如下:
[0020]
Thd = {Int,float char, Int <>,float <>,char <>,
[0021]int [I], int [2], , float [I], float [2], , char [I], char [2],...};
[0022]并给出所述基本数据类型的论域
[0023]

D6 M InHJlrrt < > UteOUF 1at U F 1at Ou
[0024]Float [] U Char U CharO U Char [];
[0025]其中:
[0026]

-{intj Int<>+竺 2s X {int <:>]

IntO = Sri X {intQ/or n > I}, JntQ Mun2rl Int[n]

-Float if F X {float}, Float <>竺 Fs X {Boat <>

Floatfl 竺 Fk X {f1atflforn > I}, P1atQ 岜Urm Float[n]

—Char ? C X {char}* Char <>? C * x {char <>}

CliarO = CnX {charQ/orn > I}, Char{] =Uttai Cliar[n].
[0027]步骤1.2,用Ist定义表示一种基本数据类型,其中T eT#,从而可以得到类型声明公式:
[0028]
T χ M Isr(%);
[0029]步骤1.3,定义一个解释I [e]来表示变量e类型化的值,其中中]e2?fcU{ml}, nil
表示变量还未定义;
[0030]例如:1[8]= (8,int),I[〈' x' , 1 y' >] = (〈' x' , 1 y' >,char〈>)。
[0031]步骤1.4,对于每一种基本数据类型,引入指针类型,记作T*,而指针类型的集合用?=U *『e TtJ表示.
[0032]指针类型的解释需要一个合适的地址模型,因此把指针t解释为(X,int),表示指针t指向变量χ,而*t解释为χ ;
[0033]步骤1.5,定义指针类型的论域如下:
[0034]
--ft^{Pu{NULL})xJ;a;
[0035]其中,P代表所有变量名的集合,NULL是一个空指针;如果指针t为空指针,t的解释 I[t] = (NULL,T*),否则 I [t] = (x,T*);
[0036]步骤1.6,定义指针的基本操作引用⑷和解引用(*)如下:
[0037]

, ((X, T *)如果K*) = (IVf)其中,T不是指针类型
1[&χ\ = \,
Inil否则
I nil否则.
[0038]空指针在程序中是非常有用的,所以MSVL中,也允许NULLw在程序中出现,其中Tm eyPk。因为每一个表达式要有确定的类型,所以下标Τ* 一般情况不能省略。只有在省略后不引起歧义的情况下才可以省略;
[0039]例如和 t2 分别代表 int* 和 char* 那么公式 h = NULLint* Λ t2 = NULLchar* 可以简写为L = NULL Λ t2 = NULL,这样我们不可能误以为是& = t2。
[0040]步骤1.7,在基本数据类型,已经定义用Ist (.)来表示一种T类型,现在把指针类型仏^扩展进去;对于每一个指针类型,定义如下:
[0041 ] Zsr- T 1:并且(令',Γ) ηφ true.
[0042]其中,露是bool类型,上式解释为,如果变量V是T类型,则为true,否则为false ;
[0043]步骤1.8,如下定义指针类型变量的声明:
[0044]
Tx^ Isr{x}
[0045]其中,T
[0046]示例说明:
[0047]如图2所示,用指针实现三个整数从大到小的排序。
[0048]示例代码:
[0049]funct1n swap (int*pl,int*p2)
[0050]//swap two variables using pointers
[0051]{frame (n) and (int n and skip ;
[0052]n:= *pl ;*pl:= *p2 ;*p2: = n)};
[0053]{frame (nl,n2,n3,pi, p2,p3)and(
[0054]int nl,n2,n3and skip ;
[0055]int*pl,*p2,*p3and skip ;
[0056]input (nl,n2,n3) and skip ;
[0057]p1:= &nl ;p2:= &n2 ;p3:= &n3 ;
[0058]if (nl > n2) then {swap (pi,p2)} else {skip};
[0059]if (n2 > n3) then {swap (p2, p3)} else {skip};
[0060]if (nl > n3) then {swap (pi, p3)} else {skip};)
[0061]需要说明的是,所述步骤2中具体流程如下:
[0062]步骤2.1,在指针类型的基础上引入结构体类型,用S表示结构体类型,Ts,表示一个可数的结构体类型集合,则有S E I;对每一种结构体类型,用S*表示结构体类型S的指针类型,则所述结构体中指针类型的集合为及s = CS * Is Ε ?;
[0063]步骤2.2,初步定义结构体为:
[0064]struct SlT^1,...,Tkak];
[0065]其中S e Ts.,k>-L.as,…,e IT1,…,Tk € TdXTs (\表示除去),V为所有变量名的集合,r*竺圮u Jpb u rsu;s,#为基本数据类型的集合,Tpt为指针类型的集合;所述结构体类型S中的每一个成员ak分别对应类型Tk ;
[0066]为了简化这个理论,不允许结构体嵌套,但是允许一个结构体成员的指针指向另一个结构体类型。这样,就可以容易地定义链表、树和图等复杂数据类型。
[0067]步骤2.3,一旦定义好一个结构体类型S,就可以用Sx来声明一个新的结构体类型变量,因此X就拥有的所有成员类型,可以用X.a来表示的每一个成员;同样还可以定义一个结构体指针类型S*t,其中eTpS,用t_> a来指向结构体的成员a,结构体指针类型
S*t为空指针,把t解释为(NULL,S*),否则,把t解释为(X,S*);综上所述,结构体指针类型的论域定义如下:
[0068]


2)ps ^CPu(NULL)) χ Tps.
[0069]步骤2.4,结构体类型定义为struct S {1>1;..., Tkak],对于每一个类型的变量χ把它解释为(見S ),其中# =(ak,(tv Tfc))];对于χ的论域其实就是它每一个成员变量论域的集合,其中涉及到基本数据类型域巧、指针类型域?#或者结构体指针类型域2V;综上所述,结构体类型的论域定义如下:
[0070]
% 笙 FPF {V, Db U l}pb U Dps) χ Ts
[0071]可以得出为一个嵌套的二元组,其中FPF (E1, E2)表示从集合E1到集合E2所有的有限偏函数,如下定义FPF:
[0072]


FPFCB1,E2) 4J (E)E c E1 χ I2)
[0073]其中,E是有限的,并且如果(u, V), (u, V' ) GE,那么V = V',即u和V是--
对应的;
[0074]结构体的基本操作是结构体成员的存取。对每一个成员ae v,a表示结构体成员的名字。定义“.a”来进行成员的存取操作。例如:假定e是一个结构体类型,而a是它的一个成员,那么e.a就返回成员a。
[0075]所以,就有了如下定义:
[0076]

rr , ((V1T) SP*/fe] = ({...,(?(V,r)5}

11 e, aj = ^

V nil否则
[0077]之前在指针类型部分定义过一般指针的引用和解引用操作,对于结构体指针类型同样适用。例如:假定t是一个指向结构体a的结构体指针类型,用t- > a就可以返回a。
[0078]所以,就有了如下定义:
[0079]
t—> a = (* t).a
[0080]和基本数据类型指针一样,在程序中我们也允许结构体指针类型为空,表示为
NULLT*,其中T Tss。
[0081]结合之前的基本数据类型指针,我们可以把NULLw解释为(NULL,T*),其中,+T ,同样的,当下标τ*省略不会弓丨起歧义时可以省略。
[0082]步骤2.5,对于基本数据类型和指针类型有T eU 现在对其进行扩展,把结构体类型引入就得到Ti;并且对于每一个Γ ETd,都有:
[0083]IsT: T ^3 并且(.化 Tl B true.
[0084]步骤2.6,由于结构体类型的复杂性,用逻辑公式来进行结构体的形式化定义和变量声明并不是一件容易的事,所以不得不考虑一些细节问题:
[0085]首先,要考虑结构体类型定义不合法的可能性。用下面的定义:
[0086]
S1..,,S7n *e Tps(tn > O)
[0087]来声明结构体S的成员。这种情况下,规定如果Si(l < i < m)的定义不迟于结构体S的定义,结构体S的定义就是合法的。否则,就不合法。
[0088]例如:在程序struct S1 {int a} AO (struct S2 (S1^a2I)中,S1 在 S2 之前定义,所以S2是合法的。另外一个程序struct S1 {S2*a} Λ struct S2IS1^aJ中,因为S1和S2是同时定义的,所以也是合法的。对于如何处理不合法的结构体类型定义,一种自然的想法就是让包含有不合法结构体类型定义的不健康程序不可满足,也就是说该程序不合法。
[0089]但是,这种方法不可行。对于程序struct来说,它本身就是不健康的程序,也就是说如果 struct S2 {Si*a2}是不满足的,那么 struct S1 {S2*aJ Λ struct S2 (S1^a2I也就是不满足的,但是实际又是满足的,这就产生了矛盾。
[0090]为了解决这个矛盾,引入系统变量healthy,所述系统变量healthy为字符类型变量;所述变量healthy只有y和η两个值,默认值为y (yes),在一些坏情况下设置为n (no);由于不允许在程序中出现一个显示的系统变量,所以要求程序员不能修改healthy变量的值。为了处理这些不健康的程序,充分利用系统变量healthy重新规范地定义结构体如下:
[0091]
struct SfTiGi,, Tk %} !S-^.healthy = 'n1)
[0092]其中P1.…Sm *} 二 Pl….,Tk) n.Tps。
[0093]步骤2.7,对于每一个结构体类型S,引入rs表示它是否定义过:结构体类型S—旦定义,rs就一直保持是true,只有S未定义前是false ;这是因为遵循MSVL极小模型语义的规则。在极小模型语义中,一个命题独立于其他命题可以为真,也可以为假时,它被解释为false ;如果struct SITa,..., Tkak]是不合法的,那么^卩玄€玄胃)在当前状态为false,并且把变量healthy的值设置为η ;
[0094]步骤2.8,在结构体变量χ拥有结构体类型S同样的成员以及类型时,则认为结构体变量χ和结构体类型S是一致的,即:
[0095]当结构体S定义为struct Sl^a1,..., Tkak]时,χ被解释为(令,幻,其中f = {{ K)},,(ak, (1?, Tk))];
[0096]步骤2.9,为了确保结构体变量及其成员的一致性,在结构体变量定义时记录它每个成员的信息,然后用来限制每一个结构体变量,因此引入一个系统变量mems定义为:
[0097]
mems eS {(a,,?,),...,{3--}^ ^ °>;
[0098]这样得到一个特殊类型:
[0099]
MEMTYPE 笙 FPF(IJiJli^s).
[0100]其中MEMTYPE是用来记录结构体每个成员的信息;
[0101]步骤2.10,得出结构体S的最终定义:
[0102]
StructSCriE2, ?…r^a^} = u{rshMems =
{(a^F,),-,CafeiTk}}}A{~,(TSiA-ArsJ healthy= V)
[0103]其中{5,= {Γ,,...,, FfelnJpjo ,当 k = 0 时,IXa1, T1),...(akTk)}是空集0
O
[0104]需要说明的是,所述步骤3的具体流程为:
[0105]步骤3.1,所述结构体变量定义为一个嵌套的二元组;
[0106]步骤3.2,为了检查结构体变量和定义的一致性,定义一个断言Cons用Cons(X,mems)表示一致;对于每一个 S eJ;并且{(ai,T1),...(akTk)} e MEMTYPE,都有:
[0107]Cons: 5 X MEMTYPE 3:并且(犯 S), Kai,rj,...Cas-Fl.)]
[0108]η-, trueβ 当且定当有分={{S1.Cifi1,F1)),(?,^?,Tfe))}
[0109]步骤3.3,结合所述变量healthy给出结构体类型以及结构体指针类型的声明如下:
[0110]
5χ M if rs then □ Iss((;t)ACo%0v?meuis))else healthy = V
[0111]
S ^x4S I! rs then Is5lt (?) else healthy = fTi!.
[0112]如果一个结构体变量声明Sx是合法的,一旦它被定义,rs就会一直保持,用
□Iss(X) Λ Cons (x,mems)来确保生成结构体变量χ的类型和值和结构体类型S保持一致;如果因为结构体类型S没有定义而导致Sx和S*x不合法,那么在当前状态下rs为false,并且系统变量healthy设置为’ η’。
[0113]如图3所示,给出一个链表逆置的例子,示例代码如下:
[0114]struct node{int data and node氺nexts};
[0115]Frame (si, s2, s3, p, q, r) and(
[0116]//Variable initializat1n
[0117]Node si, s2, s3and skip ;
[0118]//Build the linked list
[0119]s1.data: = 10 ;sl.nexts: = &s2 ;
[0120]s2.data:= 20 ;s2.nexts:= &s3 ;
[0121 ] s3.data: = 30 ;s3.nexts: = NULL ;
[0122]//Pointer initializat1n
[0123]Node*p, *q, *r and skip ;
[0124]P: = &sl ;q: = NULL ;
[0125]//In-place reverse the linked list
[0126]While (P ! = NULL)
[0127]{r:= p- > nexts ;p- > nexts:= q ;q:= p ;p:= r})
[0128]需要说明的是,所述步骤5中对结构体指针类型的赋值操作步骤如下:
[0129]对于赋值操作t = &x的执行,流程如下:
[0130]步骤5.1.1,查找符号表,查看变量χ是否存在,如果存在,执行步骤5.1.2,否则执行步骤5.1.5 ;
[0131]步骤5.1.2,查找符号表,查看t是否为结构体指针类型,如果是,执行步骤5.1.3,否则执行步骤5.1.5 ;
[0132]步骤5.1.3,判断&x的类型和结构体指针t类型是否相等,如果是,执行步骤5.1.4,否则执行步骤5.1.5 ;
[0133]步骤5.1.4,执行操作t = &x ;
[0134]步骤5.1.5, I [t] ^ I [&x],向用户提示t = &x不满足。
[0135]对于赋值操作χ = *t的执行,流程如下:
[0136]步骤5.2.1,查找符号表,看变量χ是否存在,如果存在,执行步骤5.2.2,否则执行步骤5.2.5 ;
[0137]步骤5.2.2,在符号表中查找t,首先看t是否是一个结构体指针类型,如果是,然后再看*t的取值是否为数据域中的一个常量,如果是,执行步骤5.2.3,否则执行步骤
5.2.5 ;
[0138]步骤5.2.3,对变量χ的取值进行判断,如果变量χ的取值为nil时,将*t的取值赋给X,使得X = *t等式满足,赋值操作执行成功,否则执行步骤5.2.4 ;
[0139]步骤5.2.4,如果χ的取值不是nil,判断χ的取值是否等于*t的取值,如果相等,那么等式满足,赋值操作执行成功,赋值操作流程结束,如果取值不相等,执行步骤5.2.5 ;
[0140]步骤5.2.5, I [χ] ^ I [*t],向用户提示x = 不满足。
[0141]需要说明的是,所述步骤5中的结构体类型的赋值操作步骤如下:
[0142]对于赋值操作χ = S.a的执行,流程如下:
[0143]步骤5.3.1,查找符号表,看变量χ是否存在,如果存在,执行步骤5.3.2,否则执行步骤5.3.5 ;
[0144]步骤5.3.2,查找符号表,检查变量S是否为结构体类型,如果是,执行步骤5.3.3,否则执行步骤5.3.5 ;
[0145]步骤5.3.3,遍历结构体S的存储链表,找出成员a所在项,如果查找成功,执行步骤5.3.4,否则执行步骤5.3.5 ;
[0146]步骤5.3.4,执行操作χ = S.a ;
[0147]步骤5.3.5, I [x] ^ I [S.a],向用户提示x = S.a不满足。
[0148]对于赋值操作χ = t- > a的执行,流程如下:
[0149]步骤5.4.1,查找符号表,看变量χ是否存在,如果存在,执行步骤5.4.2,否则执行步骤5.4.6 ;
[0150]步骤5.4.2,查找符号表,看t是否为结构体指针类型,如果是,执行步骤5.4.3,否则执行步骤5.4.6 ;
[0151]步骤5.4.3,查找符号表,看t所指的变量是都为结构体类型,如果是,执行步骤
5.4.4,否则执行步骤5.4.6 ;
[0152]步骤5.4.4,遍历t所指的结构体的存储链表,找出成员a所在项,如果查找成功,执行步骤5.4.5,否则执行步骤5.4.6 ;
[0153]步骤5.4.5,执行操作 χ = t- > a ;
[0154]步骤5.4.6, I [χ] ^ I [t_ > a],向用户提示 x = t_ > a 不满足。
[0155]本发明的有益效果在于:本发明在MVSL基本数据类型和指针类型的基础上,扩展结构体以及结构体指针类型,使得MSVL可以运用在包含更加复杂的数据类型的系统中,对系统进行建模、仿真和验证,也使得MSVL和传统编程语言之间的差距减小,使得MSVL更加的实用。

【专利附图】

【附图说明】
[0156]图1为本发明的系统模块构成示意图;
[0157]图2为用指针实现三个整数从大到小排序示例示意图;
[0158]图3为链表逆置示例示意图。

【具体实施方式】
[0159]以下将结合附图对本发明作进一步的描述,需要说明的是,本实例以本技术方案为前提,给出了具体的实施方式,但并不限于本实施例。
[0160]如图1所示,MSVL中结构体及结构体指针类型的扩展解释系统及其扩展方法,所述系统包括如下模块:
[0161]结构体类型定义模块:所述结构体类型定义模块包括结构体类型的定义;
[0162]结构体变量定义声明模块:所述变量定义声明模块包括所述变量声明命令以及类型声明定义;
[0163]结构体变量存储模块:所述变量存储模块包含有变量类型标记和变量取值,所述变量类型标记根据变量声明语句记录该变量的类型,变量存储两边的取值限制在其类型所对应的论域内;
[0164]结构体及结构体指针类型赋值操作处理模块:赋值操作的左操作数为变量,右操作数为表达式并对左操作数进行解释。
[0165]基于上述系统的MSVL中结构体以及结构体指针类型的扩展方法,实施步骤如下:
[0166]1、基本数据类型集合用Ta表示,包括:
[0167]①原始数据类型:int float char
[0168]②列表类型:int〈>float〈>char〈>
[0169]③数组类型:int[] float [] char []
[0170]2、由于在类型声明时,定义一个数组需要给定数组长度,比如:int [a] 5。所以修改基本数据类型集合为巧:
[0171]

TJf 竺{intfsoatcharjnt 0.,float O,char O,
[0172]int [I],int [2], , float [I],float [2], , char [I],char [2], }
[0173]3、基本数据类型论域用3?表示,
[0174]

Ds != IiitUIntO Ufefl UftoatUF1at Ou
[0175]Float [] U Char U CharO U Char []
[0176]其中,
[0177]

-1nf --χ {int}, Iirt <> 竺 I? X {int <>.]

IntQ = Ir K {intO/or n > I}, lirt{] =Uf5ii Int[n]

-Float if F X {float}, Float <>竺 Fs X {Boat <>

Floatfl 竺 Fk X {f1atflforn > I}, P1atQ 岜Urm Float[n]

—Char = Cx {char).Char O= Cs X {char <>}

CIiarQ = Cr‘ X {charQ/wR > I},CharQ =Uakl Charfn].
[0178]4、用Ist定义表示一种数据类型,其中T1 eT,,从而可以得到类型声明公式:
[0179]
T χ ^ Isr(.t);
[0180]5、定义一个解释I [e]来表示变量e类型化的值,其中/Wnil表示变量还未定义。
[0181]例如:1[8]= (8,int),I[〈' x' , 1 y' >] = (〈' x' , 1 y' >,char〈>)。
[0182]6、对于每一种数据类型,引入指针类型,记作T*,而指针类型的集合用
;b 二 U * |r E Jy.表示;
[0183]7、指针类型的解释需要一个合适的地址模型。一种可能性就是把地址模型当作是位置到值得映射,这种情况下,用”&X”符号来取得变量X的地址。但是这种方法不够抽象,因为这依赖一些例如具体内存地址的实现细节。为了使得实现更加灵活,可以把指针t解释为(X,int),表示指针t指向变量X,而*t解释为X。
[0184]8、定义指针类型的论域I? {Vu{NULL})xJ?ft?其中,v代表所有变量名的集合,NULL是一个空指针。
[0185]9、如果 t 为空指针,t 的解释 I[t] = (NULL, T*),否则 I[t] = (x, T*)。
[0186]10、指针的基本操作是引用⑷和解引用(*)。定义如下:
[0187]
,re , ((X.J *)如果K4 = (1ΛΓ)其中,T不是指针类型
/[&*] = I,
Inl!否则
=如果取]=汉卜)


I nil
[0188]11、空指针在程序中是非常有用的,所以MSVL中,也允许NULLw在程序中出现;其中。因为每一个表达式要有确定的类型,所以下标τ* 一般情况不能省略。只有在省略后不引起歧义的情况下才可以省略;
[0189]例如It1 和 t2 分别代表 int* 和 char*,那么公式 h = NULLint* Λ t2 = NULLchar* 可以简写为L = NULL Λ t2 = NULL,这样我们不可能误以为是& = t2。
[0190]12、在基本数据类型,已经定义用IsT(.)来表示一种T类型。现在把指针类型Tpb.扩展进去。
[0191]13、把指针类型巧:.扩展进去;对于每一个指针类型,定义如下:
[0192]Isr.Γ — 3 并且.D H trae.
[0193]其中,_是bool类型,上式解释为,如果变量V是T类型,则为true,否则为false ;
[0194]14、如下定义指针类型变量的声明:
[0195]
TxH IsT(£)
[0196]其中,Te^0
[0197]15、在指针类型的基础上,在MSVL中引入结构体(struct)类型,用S表示,表示一个可数的结构体类型集合,即s e Ts;对每一种结构体类型,用s*来表示结构体s的指针类型,因此,所述结构体中指针类型的集合可以表示为;={s HS e rs};
[0198]Mrd =圮U来表示基本数据类型、指针类型、结构体类型和与之相关联的指针类型的集合。这样,就可以如下定义结构体:
[0199]struct S (T1B1,...,Tkak}
[0200]其中S eap …,% e T1,…,Tk € Td\Ts (\ 表示除去);
[0201]这样就定义了一个结构体S,它的每一个成员ak分别对应类型Tk。
[0202]为了简化这个理论,不允许结构体嵌套,但是允许一个结构体成员的指针指向另一个结构体类型。这样,就可以容易地定义链表、树和图等复杂数据类型。
[0203]16、一旦定义好一个结构体类型S,就可以用Sx来声明一个新的结构体类型变量。所以,X就拥有的所有成员类型,可以用X.a来表示的每一个成员。同样还可以定义一个结构体指针类型S*t,用t- > a来指向结构体类型的成员a。
[0204]17、结构体指针类型论域:和其他类型指针一样,定义一个结构体指针类型S*t eTps。如果为空指针,把t解释为(NULL, S*)。否则,把t解释为(χ, S*)。
[0205]综上所述,结构体指针类型的论域可以如下定义:
[0206]
Sps M (V U {NULL}) X Jps
[0207]18、结构体论域:结构体类型定义为struct Sl^a1,..., Tkak},对于每一个类型的变量χ把它解释为(U),其中# = {( B1A^T1Y),..,JBkt Tk))]。所以,对于X的论域其实就是它每一个成员变量论域的集合,其中涉及到基本数据类型域2?、指针类型域或者结构体指针类型域2^。
[0208]综上所述,结构体类型的论域可以如下定义:
[0209]
?s M FPF (V, D6 U Bp6 U Dps) x Ts
[0210]可以得出鳥为一个嵌套的二元组。其中,FPF(E1, E2)表示从集合E1到集合E2所有的有限偏函数。如下定义FPF:
[0211]
FPF(E1^2)M(E)Ec1B1XEsJ
[0212]其中,E是有限的,并且如果(u, V), (u, V' ) GE,那么V = V',即u和V是--
对应的。
[0213]19、结构体的操作:结构体的基本操作是结构体成员的存取。对每一个成贝a e V,a表示结构体成员的名字。定义“.a”来进行成员的存取操作。假定e是一个结构体类型,而a是它的一个成员,那么e.a就返回成员a。
[0214]所以,就有了如下定义:
[0215]
f [e a]= f (v,T)如果 i{e] = ({…,(a.,(y, t)\…},5)
3 I nil 否则
[0216]20、之前在指针类型部分定义过一般指针的引用和解引用操作,对于结构体指针类型同样适用。假定t是一个指向结构体类型a结体指针类型,用t- > a就可以返回a。
[0217]所以,就有了如下定义:
[0218]
t—> a M {* t}.a.?
[0219]21、和基本数据类型指针一样,在程序中我们也允许结构体指针类型为空,表示为NULLt*,其中
[0220]结合之前的基本数据类型指针,我们可以把NULLw解释为(NULL,T*),其中,Γ Jp6UJps,同样的,当下标T*省略不会引起歧义时可以省略。
[0221]22、之前已经定义过用IsT(.)表示一种T类型。对于基本数据类型和指针类型^TeT/ u Jpfco现在对其进行扩展,把结构体类型引入就得到T气并且对于每一个Γ eTd,都有
[0222]Is7: T ^3 并且(也 7} η true。
[0223]23、由于结构体类型的复杂性,用逻辑公式来进行结构体的形式化定义和变量声明并不是一件容易的事,所以不得不考虑一些细节问题:
[0224]首先,要考虑结构体类型定义不合法的可能性。用下面的定义:
[0225]
?^1 *'-.^oSrnC消—Oj
[0226]来声明结构体S的成员。这种情况下,规定如果Si(l < i < m)的定义不迟于结构体S的定义,结构体S的定义就是合法的。否则,就不合法。
[0227]例如:在程序struct S1 {int a} AO (struct S2 (S1^a2I)中,S1 在 S2 之前定义,所以S2是合法的。另外一个程序struct S1 {S2*a} Λ struct S2IS1^aJ中,因为S1和S2是同时定义的,所以也是合法的。
[0228]对于如何处理不合法的结构体类型定义,一种自然的想法就是让包含有不合法结构体类型定义的不健康程序不可满足,也就是说该程序不合法。但是,这种方法不可行。对于程序struct S2 (S1^a2I来说,它本身就是不健康的程序,也就是说如果struct S2 (S1^a2I是不满足的,那么struct S1 {S2*aJ Λ struct S2 {SfaJ也就是不满足的,但是实际又是满足的,这就产生了矛盾。为了解决这个矛盾,引入一个系统变量字符类型变量healthy,healthy变量只有两个值,y (yes)和n (no),默认值为y,只有在一些坏情况下,healthy值设置为η。我们不允许在程序中出现一个显示的系统变量,所以我们要求程序员不能修改healthy变量的值。为了处理这些不健康的程序,我们充分利用系统变量healthy重新规范地定义结构体如下:
[0229]
structSIT1 at,...fTkak] M OrjA(-1(? Λ …Ars ) -+ healthy = V)
[0230]其中{5:'...,Sra= [T1,...,Tk] n Tpso
[0231]24、对于每一个结构体类型S,我们引入匕表示它是否定义过。S—旦定义,IV就一直保持是true,只有S未定义前是false。这是因为我们遵循MSVL极小模型语义的规则。在极小模型语义中,一个命题独立于其他命题可以为真,也可以为假时,它被解释为假;如果struct SiT1B1, , Tkak]是不合法的,那么1(1 ^ ^么叫在当前状态为假,并且把healthy
变量的值设置为’η’。我们称一个区间σ是健康的,当且定当区间对σ的每一个状态都有:s[healthy] = (' y' ,char)。这样,一个包含不合法结构体类型定义的程序没有一个健康的极小模型。
[0232]25、为了定义系统变量healthy,我们假定每一个程序P开始时,都用一个特别的公式initsys(p)来指定系统变量,整个程序就可以写成initsys (ρ) Λ P。init sys (p)定义如下:
[0233]
initsys(p) = char healthy Λο(—IieaIlIiy = V)..^ ?
[0234]其中,initsys (p)表示p的初始化。rhMlthy表示之前没有出现过,默认为'y'。
[0235]根据极小模型语义,没有被赋值时为false ;那么,从上式就可以看出healthy变量默认值是’ y’,只有在出现一些例如不合法结构体类型定义的坏情况下值才被改为’ η’。
[0236]26、我们需要依据结构体成员以及他们的类型确保结构体变量和结构体类型定义的一致性。
[0237]在结构体变量χ拥有结构体类型S同样的成员以及类型时,我们认为结构体变量χ和结构体类型S是一致的,也就是说:
[0238]当结构体被定义为struct SlTp1,..., Tkak],χ被解释为(脅J};其中
I* =71}),,,,, {Sjj, (1?.Tj-)} J0
[0239]27、为了确保一个结构体变量和它成员的一致性,在结构体变量定义时记录它每个成员的信息,然后用来限制每一个结构体变量。为此,再度引入一个系统变量mems,定义为:
[0240]


ITtems 钽
[0241]这样得到一个特殊类型:
[0242]
MEMTYPE ¥ FPF(ETdVTs)
[0243]其中MEMTYPE是用来记录结构体每个成员的信息。
[0244]28、下面给出结构体的最终定义:
[0245]

striictStr, a,, Tkak} ? DfrsAmems =
CCa1-T11),…,Ca5r,Tk)})A(~,(rSiA…ArsJ healthy = V)
[0246]其中{5:'? - } = {V' Γ?}η Tps;当 k = O 时,常量{ (BijT1),…(akTk)}是空集
_,并且给出initsys (ρ)的最终规范定义:
[0247]
Initsys(p) = char heaIihy Λπt^y healthy — yf}
[0248]


= 0)Λ -AC-^rsjfi —= 0))
[0249]其中,S1,...,Sn都是程序p中出现过的结构体。如果
[0250]某个Si未被定义,则初始化为0。
[0251]29、为了检查结构体变量和定义的一致性,定义一个断言Cons,用Cons(x,mems)表示一致;
[0252]对于每一个Se Ts 并且{(a1; T1),...(akTk)} e MEMTYPE,都有:
[0253]Conj: 5 X MEMTYPE 3 并且(觉.S)., KaiT1),...(β-Jk)}
[0254]— iru+e,当且定当有# = {( S1, {%, T1)), , (a,., , Tk))}
[0255]形式化表示必须区分变量声明的合法与不合法。对于结构体S,如果结构体类型定义struct S{}不迟于变量声明Sx或者S*,我们就称之为合法的变量声明,否则,为不合法的。
[0256]Sx Λ struct S{...}之前我们定义过一个包含不合法的结构体类型定义的程序为不健康的程序,现在我们将其扩展为,一个包含不合法的结构体类型定义或者不合法的变量声明的程序,我们称之为不健康的程序。换句话说就是一个健康的程序要求它结构体类型定义和变量声明都要合法。
[0257]和之前不合法的结构体类型定义一样,想要使一个包含不合法变量声明的程序不可满足,理论上也是不可实行的。为了处理这些不健康程序,结合系统变量healthy给出更规范的变量声明:
[0258]
Sx !f rs then Iss((a;)ACons(^ iBems})else healthy = V
[0259]
5 If rs then Is5si {x) else healthy = Vt
[0260]如果一个结构体变量声明Sx是合法的,一旦它被定义,rs就会一直保持,用
□Iss(X) Λ Cons (X, mems)来确保生成变量χ的类型和值和结构体S保持一致;如果因为结构体S没有定义而导致Sx和S*x不合法,那么在当前状态下rs为false,并且系统变量healthy 设置为’ η,。
[0261]综上,得出结论:
[0262]I) 一个包含不合法结构体类型定义或者不合法变量声明的不健康程序,没有一个健康的极小模型。
[0263]2) 一个健康的程序没有一个不健康的极小模型。
[0264]30、结构体指针类型的赋值操作步骤如下:
[0265]30.1、对于赋值操作的t = &x执行,流程如下:
[0266]步骤1,查找符号表,查看变量χ是否存在,如果存在,执行步骤2,否则执行步骤5 ;
[0267]步骤2,查找符号表,查看t是否为结构体指针类型,如果是,执行步骤3,否则执行步骤5 ;
[0268]步骤3,判断&x的类型和结构体指针类型t是否相等,如果是,执行步骤4,否则执行步骤5 ;
[0269]步骤4,执行操作t = &x ;
[0270]步骤5, I [χ]古I [*t],向用户提示t = &x不满足。
[0271]30.2、对于赋值操作χ = *t的执行,流程如下:
[0272]步骤1,查找符号表,看变量χ是否存在,如果存在,执行步骤2,否则执行步骤5 ;
[0273]步骤2,在符号表中查找t,首先看t是否是一个结构体指针类型,如果是,然后再看*t的取值是否为数据域中的一个常量,如果是,执行步骤3,否则执行步骤5 ;
[0274]步骤3,对变量χ的取值进行判断,如果变量χ的取值为nil时,将*t的取值赋给X,使得x = *t等式满足,赋值操作执行成功,否则执行步骤4 ;
[0275]步骤4,如果χ的取值不是nil,判断χ的取值是否等于*t的取值,如果相等,那么等式满足,赋值操作执行成功,赋值操作流程结束,如果取值不相等,执行步骤5 ;
[0276]步骤5, I [x] ^ I [*t],向用户提示χ = *t不满足。
[0277]31、对结构体类型的赋值操作步骤如下:
[0278]31.1、对于赋值操作χ = S.a的执行,流程如下:
[0279]步骤1,查找符号表,看变量χ是否存在,如果存在,执行步骤2,否则执行步骤5 ;
[0280]步骤2,查找符号表,检查变量S是否为结构体类型,如果是,执行步骤3,否则执行步骤5 ;
[0281]步骤3,遍历结构体S的存储链表,找出成员a所在项,如果查找成功,执行步骤4,否则执行步骤5 ;
[0282]步骤4,执行操作χ = S.a ;
[0283]步骤5, I [χ]古I [S.a]向用户提示x = S.a不满足。
[0284]31.2、对于赋值操作χ = t_ > a的执行,流程如下:
[0285]步骤1,查找符号表,看变量χ是否存在,如果存在,执行步骤2,否则执行步骤6 ;
[0286]步骤2,查找符号表,看t是否为结构体指针类型,如果是,执行步骤3,否则执行步骤6 ;
[0287]步骤3,查找符号表,看t所指的变量是都为结构体类型,如果是,执行步骤4,否则执行步骤6 ;
[0288]步骤4,遍历t所指的结构体的存储链表,找出成员a所在项,如果查找成功,执行步骤5,否则执行步骤6;
[0289]步骤5,执行操作χ = t- > a ;
[0290]步骤6, I [x] ^ I [t- > a],向用户提示x = t_ > a不满足。
[0291]对于本领域的技术人员来说,可以根据上述的技术方案和构思,给出各种相应的改变和变形,而所有的这些改变和变形都应该包括在本发明权利要求的保护范围之内。
【权利要求】
1.MSVL中结构体以及结构体指针类型的扩展解释系统,其特征在于,所述系统包括如下模块: 结构体类型定义模块:所述结构体类型定义模块包括结构体类型的定义; 结构体变量定义声明模块:所述结构体变量定义声明模块包括变量声明命令以及类型声明定义; 结构体变量存储模块:所述结构体变量存储模块包含有变量类型标记和变量取值,所述变量类型标记根据变量声明语句记录变量的类型,变量存储两边的取值限制在其类型所对应的论域内; 结构体及结构体指针类型赋值操作处理模块:赋值操作的左操作数为变量,右操作数为表达式并对左操作数进行解释。
2.一种根据权利要求1的MSVL中结构体以及结构体指针类型的扩展方法,其特征在于,所述方法包括如下步骤: 步骤1,对于MSVL中的基本数据类型引入指针类型; 步骤2,在指针类型的基础上引入结构体类型,扩展出结构体及结构体指针类型;通过所述结构体类型定义模块,并结合结构体类型定义的条件,给出正确的结构体类型定义;步骤3,通过所述结构体变量定义声明模块,用MSVL中的类型声明语句定义结构体变量,并声明所述结构体以及结构体指针类型; 步骤4,通过所述结构体变量存储模块,根据所述结构体变量所声明的类型及其语义,将所述结构体变量保存在MSVL符号表中; 步骤5,在所述结构体及结构体指针类型赋值操作处理模块中对所述结构体以及结构体指针类型进行赋值操作。
3.根据权利要求2所述的MSVL中结构体以及结构体指针类型的扩展方法,其特征在于,所述步骤I中在基本数据类型中引入指针类型具体流程如下: 步骤1.1,所述基本数据类型集合用^表示,其中包括原始数据类型int float char、列表类型int〈>float〈>char〈>、数组类型int [] float [] char [],则给定数组长度的基本数据类型集合用交表示,定义如下:
int [I],int [2],…,float [I],float [2],…,char [I],char [2],…}; 并给出所述基本数据类型的论域
Float [] U Char U CharO U Char []; 其中:
步骤1.2,用Ist定义表示一种基本数据类型T,从而得到类型声明公式:IsrCt); 其中re#; 步骤1.3,定义一个解释I [e]来表示变量e类型化的值,其中,eD6U[mT}, nil表示变量还未定义; 步骤1.4,对于每一种基本数据类型,引入指针类型,记作T*,而指针类型的集合用Tpb =.表示;指针类型的解释需要一个合适的地址模型,因此把指针t解释为(X,int),表示指针t指向变量X,而*t解释为X ; 步骤1.5,定义指针类型的论域如下:?Μ (V U {NULL}) X Jpil.其中,V代表所有变量名的集合,NULL是一个空指针;如果指针t为空指针,t的解释I [t] = (NULL, T*),否贝丨J I [t] = (x, T*); 步骤1.6,定义指针的基本操作引用⑷和解引用(*)如下:
步骤1.7,在基本数据类型,已经定义用Ist (.)来表示一种T类型,现在把指针类型扩展进去;对于每一个『eJVb,定义如下:isr.T — 3 并且(也打 B tme.其中,3是bool类型,上式解释为,如果变量V是T类型,则为true,否则为false ; 步骤1.8,如下定义指针类型变量的声明:T X = Isr Cr)





, 其中,T eTpto
4.根据权利要求2所述的MSVL中结构体以及结构体指针类型的扩展方法,其特征在于,所述步骤2中具体流程如下: 步骤2.1,在指针类型的基础上引入结构体类型,用S表示结构体类型,Ts表示一个可数的结构体类型集合,则有S E I;对每一种结构体类型,用S*表示结构体类型S的指针类型,则所述结构体类型中指针类型的集合为Tps = (S *■:S E Ts); 步骤2.2,初步定义结构体类型为: struct S (I^a1,..., Tkak}; 其中S € 么Ib1," e VsT1广、Tk € Td\Ts (\表示除去),V为所有变量名的集合,” =u ^ u ‘;所述结构体类型S中的每一个成员ak分别对应类型Tk ; 步骤2.3,定义好一个结构体类型S之后,用Sx来声明一个新的结构体变量,这样X就拥有的所有成员类型,用X.a来表示的每一个成员;定义一个结构体指针类型S*t其中S#t e7P,用t- > a来指向结构体类型的成员a ;如果结构体指针类型S*t为空指针,把t解释为(NULL,S*),否则,把t解释为(x,S*);结构体指针类型的论域定义如下:Dps 5 (V U {NULL}) X Tm.步骤2.4,结构体类型的论域定义如下:Ds 竺 FPF (V, Vi U Dpi U Dps) X Ts 可以得出取为一个嵌套的二元组,其中FPF(E1, E2)表示从集合E1到集合E2所有的有限偏函数,如下定义FPF:FPF(£,.£2) = [Εβ c £, X E2J.其中,E是有限的,并且如果(u,V),(u,v' ) GE,那么v = v',即u和V是一一对应的; 步骤2.5,对于基本数据类型和指针类型有T eT/ UTfrt,现在对其进行扩展,把结构体类型引入就得到P;并且对于每一个:T e 都有
Isr.T -*m并且(?T) B true.步骤2.6,引入系统变量healthy,所述系统变量healthy为字符类型变量;所述变量healthy只有y和η两个值,默认值为y,在一些坏情况下设置为η ; 步骤2.7,对于每一个结构体类型S,引入rs表示它是否定义过:结构体S —旦定义,rs就一直保持是true,只有S未定义前是false ;如果struct Sl^a1,..., TKak}是不合法的,那么<叫在当前状态为false,并且把变量healthy的值设置为’ η’ ; 步骤2.8,在结构体变量X拥有结构体类型S同样的成员以及类型时,则认为结构体变量X和结构体类型S是一致的,即: 当结构体类型S定义为struct S {1>1;..., Tkak}时,χ被解释为(_=_ S ),其中# = {( TJ}, (ak, (1?, Tb ))]; 步骤2.9,为了确保结构体变量及其成员的一致性,在结构体变量定义时记录它每个成员的信息,然后用来限制每一个结构体变量,因此引入一个系统变量mems,定义为:腳ns 變{(a;?r.),> O); 这样得到一个特殊类型:MEMTYPE 笙 FPF(1^J?\JS).其中MEMTYPE是用来记录结构体每个成员的信息; 步骤2.10,得出结构体类型S的最终定义:

struct SCriS2, ?…TkBk] = ο {r5/\meiiis-=--^-- …,(?, 4)})/\(-(rStA-ArsJ — Wealthy = V);其中{S,* } = {Γ,, — ,Γ^Ιη Jpj,当 k = 0 时,IXa1, T1),...(akTk)}是空集0。
5.根据权利要求2所述的MSVL中结构体以及结构体指针类型的扩展方法,其特征在于,所述步骤3的具体流程为: 步骤3.1,所述结构体变量定义为一个嵌套的二元组; 步骤3.2,为了检查结构体变量和定义的一致性,定义一个断言&)113用&)113(1,1116110表示一致;对于每一个S e 3;并且{(ai, T1),…(akTk)} e MEMTYPE,都有:
Cohj: 5 x MEMTYPE 3并且(f.SMCaiJi),...(akTk)} B true,当且定当有# = {( a1.TJb-^(%-(?.?))}.步骤3.3,结合所述系统变量healthy给出结构体以及结构体指针类型的声明如下:Sx M if rs then □ lss((?ii)ACons(;r, mems))else healthy = 'nr

S * X= if T5 then Iss, (β} else health)' = 'n1- 如果一个结构体变量声明Sx是合法的,一旦它被定义,rs就会一直保持,用□Iss(X) Λ Cons (x,mems)来确保生成结构体变量χ的类型和值和结构体类型S保持一致;如果因为结构体类型S没有定义而导致Sx和S*x不合法,那么在当前状态下rs为false,并且系统变量healthy设置为’ η’。
6.根据权利要求2所述的MSVL结构体以及结构体指针类型的扩展方法,其特征在于,所述步骤5中对结构体指针类型的赋值操作步骤如下: 对于赋值操作t = &X的执行,流程如下: 步骤5.1.1,查找符号表,查看变量χ是否存在,如果存在,执行步骤5.1.2,否则执行步骤 5.1.5 ; 步骤5.1.2,查找符号表,查看t是否为结构体指针类型,如果是,执行步骤5.1.3,否则执行步骤5.1.5 ; 步骤5.1.3,判断&x的类型和结构体指针t的类型是否相等,如果是,执行步骤5.1.4,否则执行步骤5.1.5 ; 步骤5.1.4,执行操作t = &x ; 步骤5.1.5, I [t] ^ I [& χ],向用户提示t = &x不满足; 对于赋值操作χ = *t的执行,流程如下: 步骤5.2.1,查找符号表,看变量χ是否在存在,如果存在,执行步骤5.2.2,否则执行步骤 5.2.5 ; 步骤5.2.2,在符号表中查找t,首先看t是否是一个结构体指针类型,如果是,然后再看*t的取值是否为数据域中的一个常量,如果是,执行步骤5.2.3,否则执行步骤5.2.5 ; 步骤5.2.3,对变量χ的取值进行判断,如果变量χ的取值为nil时,将*t的取值赋给χ使得χ = *t等式满足,赋值操作执行成功,否则执行步骤5.2.4 ; 步骤5.2.4,如果χ的取值不是nil,判断χ的取值是否等于*t的取值,如果相等,那么等式满足,赋值操作执行成功,赋值操作流程结束,如果取值不相等,执行步骤5.2.5 ; 步骤5.2.5, I [x] ^ I [*t],向用户提示χ = 不满足。
7.根据权利要求2所述的MSVL中结构体以及结构体指针类型的扩展方法,其特征在于,所述步骤5中的结构体类型的赋值操作步骤如下: 对于赋值操作χ = S.a的执行,流程如下: 步骤5.3.1,查找符号表,看变量χ是否存在,如果存在,执行步骤5.3.2,否则执行步骤.5.3.5 ; 步骤5.3.2,查找符号表,检查变量S是否为结构体类型,如果是,执行步骤5.3.3,否则执行步骤5.3.5 ; 步骤5.3.3,遍历结构体类型S的存储链表,找出成员a所在项,如果查找成功,执行步骤5.3.4,否则执行步骤5.3.5 ; 步骤5.3.4,执行操作χ = S.a ; 步骤5.3.5, I [x] ^ I [S.a],向用户提示x = S.a不满足; 对于赋值操作χ = t- > a的执行,流程如下: 步骤5.4.1,查找符号表,看变量是否存在,如果存在,执行步骤5.4.2,否则执行步骤.5.4.6 ; 步骤5.4.2,查找符号表,看t是否为结构体指针类型,如果是,执行步骤5.4.3,否则执行步骤5.4.6 ; 步骤5.4.3,查找符号表,看t所指的变量是否为结构体类型,如果是,执行步骤5.4.4,否则执行步骤5.4.6 ; 步骤5.4.4,遍历t所指的结构体的存储链表,找出成员a所在项,如果查找成功,执行步骤5.4.5,否则执行步骤5.4.6 ; 步骤5.4.5,执行操作χ = t- > a ; 步骤5.4.6, I [χ]古I [t- > a],向用户提示x = t_ > a不满足。
【文档编号】G06F9/44GK104182216SQ201410334324
【公开日】2014年12月3日 申请日期:2014年7月15日 优先权日:2014年7月15日
【发明者】王小兵, 孙涛, 段振华, 赵亮, 田聪, 张南 申请人:西安电子科技大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1