Msvl中結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型的擴展解釋系統(tǒng)及其擴展方法
【專利摘要】本發(fā)明公開了一種MSVL中結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型的擴展解釋系統(tǒng),具體包括結(jié)構(gòu)體類型定義模塊、結(jié)構(gòu)體變量定義聲明模塊、結(jié)構(gòu)體變量存儲模塊和結(jié)構(gòu)體及結(jié)構(gòu)體指針類型賦值操作處理模塊;在該系統(tǒng)的基礎(chǔ)上,還公開了一種MSVL中結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型的擴展方法,該方法在MSVL基本數(shù)據(jù)類型(包括整型、浮點型、字符型、字符串型)和指針類型的基礎(chǔ)之上擴展了結(jié)構(gòu)體類型和相應(yīng)的結(jié)構(gòu)體指針類型,解決了現(xiàn)有MSVL中數(shù)據(jù)類型單一,應(yīng)用范圍窄的問題,使得MSVL可用于相對復雜的多數(shù)據(jù)類型系統(tǒng)的建模、仿真和驗證。
【專利說明】MSVL中結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型的擴展解釋系統(tǒng)及其擴展方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于計算機系統(tǒng)形式化建模與驗證【技術(shù)領(lǐng)域】,主要涉及一種MSVL中結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型的擴展解釋系統(tǒng)及其擴展方法。
【背景技術(shù)】
[0002]在諸如數(shù)字電路和軟件工程等形式化驗證領(lǐng)域,時序邏輯已經(jīng)逐漸成為描述和推理并發(fā)系統(tǒng)性質(zhì)的有效工具。投影時序邏輯(PTL)擴展了區(qū)間時序邏輯(ITL),并且被廣泛運用于系統(tǒng)說明和驗證中。大多數(shù)情況下,系統(tǒng)建模技術(shù)和時序邏輯無關(guān),但是系統(tǒng)所期望的性質(zhì)卻是用時序邏輯公式來描述的。所以,就導致了系統(tǒng)驗證出現(xiàn)這樣一個問題,系統(tǒng)建模和性質(zhì)描述采用了不同的形式化方法,而不同的形式化方法有不同的表達式和語義,于是就容易造成混淆。為了改善這一現(xiàn)狀,可以用同一種時序邏輯語言對系統(tǒng)進行建模和性質(zhì)描述。MSVL是一種用于建模、仿真和驗證程序的投影時序邏輯程序設(shè)計語言,它是PTL的一個可執(zhí)行子集。我們可以用MSVL程序來對一個系統(tǒng)建模,并且用命題投影時序邏輯(PPTL)公式來描述該系統(tǒng)的性質(zhì),最終在同一個時序邏輯框架下進行模型檢測,來驗證系統(tǒng)所期望的性質(zhì)是否滿足。
[0003]在編程語言中引入類型是很重要的,它可以讓程序員寫出更加合理和實用的程序,眾所周知,大多數(shù)傳統(tǒng)編程語言,例如C和Java都有自己的數(shù)據(jù)類型,包括整型、數(shù)組、列表、指針和結(jié)構(gòu)體等等。同樣地,在時序邏輯編程語言中引入這些類型也是非常重要的,這樣程序員不但可以寫出更加合理和實用的程序,并且可以用來驗證包含復雜類型的系統(tǒng)。但是,現(xiàn)在大多數(shù)時序邏輯語言,例如TLA和METATEM都還不支持類型。在TLA中,TLA+規(guī)范語言和PlusCal算法語言本質(zhì)上是無類型的,其中類型正確性被簡單地當作一個不變量,可以用TLC來驗證。METATEM是一個面向代理的編程語言,它的類型僅僅適用于代理,用來確保確定的行為規(guī)范是滿足的。這些語言中的類型概念和傳統(tǒng)語言中變量或者表達式的類型概念大不相同。研究投影時序邏輯語言實現(xiàn)類型的技術(shù),尤其是MSVL語言中的類型實現(xiàn),可以大大縮小投影時序邏輯語言和傳統(tǒng)語言之間的差距。
[0004]目前,在MSVL中已經(jīng)有了基本數(shù)據(jù)類型,包括整型、浮點型、字符型、字符串型和基本指針類型,但是,只有基本數(shù)據(jù)類型和指針類型不足以對一些復雜數(shù)據(jù)系統(tǒng)進行建模、仿真和驗證。為此,本發(fā)明在MSVL基本數(shù)據(jù)類型和指針類型的基礎(chǔ)上擴展了結(jié)構(gòu)體以及相應(yīng)的結(jié)構(gòu)體指針類型,使得MSVL的數(shù)據(jù)類型更加完整,可以運用在數(shù)據(jù)類型更加復雜的系統(tǒng)中,隨著類型的發(fā)展,現(xiàn)在可以把更多的C程序翻譯成類型化的MSVL程序,并且可以在MSVL解釋器工具中進行建模、仿真和驗證。
【發(fā)明內(nèi)容】
[0005]針對現(xiàn)有技術(shù)的不足,本發(fā)明旨在提供一種MSVL中結(jié)構(gòu)體及結(jié)構(gòu)體指針類型的擴展解釋系統(tǒng)及其擴展方法,在MVSL基本數(shù)據(jù)類型和指針類型的基礎(chǔ)上,擴展結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型,使得MSVL可以運用在包含更加復雜的數(shù)據(jù)類型的系統(tǒng)中,對系統(tǒng)進行建模、仿真和驗證,也使得MSVL和傳統(tǒng)編程語言之間的差距減小,使得MSVL更加的實用。
[0006]為了實現(xiàn)上述目的,本發(fā)明采用如下技術(shù)方案:
[0007]MSVL中結(jié)構(gòu)體及結(jié)構(gòu)體指針類型的擴展解釋系統(tǒng),包括如下模塊:
[0008]結(jié)構(gòu)體類型定義模塊:所述結(jié)構(gòu)體類型定義模塊包括結(jié)構(gòu)體類型的定義;
[0009]結(jié)構(gòu)體變量定義聲明模塊:所述變量定義聲明模塊包括所述變量聲明命令以及類型聲明定義;
[0010]結(jié)構(gòu)體變量存儲模塊:所述變量存儲模塊包含有變量類型標記和變量取值,所述變量類型標記根據(jù)變量聲明語句記錄該變量的類型,變量存儲兩邊的取值限制在其類型所對應(yīng)的論域內(nèi);
[0011]結(jié)構(gòu)體及結(jié)構(gòu)體指針類型賦值操作處理模塊:賦值操作的左操作數(shù)為變量,右操作數(shù)為表達式并對左操作數(shù)進行解釋。
[0012]一種基于上述系統(tǒng)的MSVL中結(jié)構(gòu)體及結(jié)構(gòu)體指針類型的擴展方法,具體包括如下步驟:
[0013]步驟1,對于MSVL中的基本數(shù)據(jù)類型引入指針類型;所述MSVL中的基本數(shù)據(jù)類型包括整型、浮點型、字符型、字符串型;
[0014]步驟2,在指針類型的基礎(chǔ)上,引入結(jié)構(gòu)體類型,擴展出結(jié)構(gòu)體及結(jié)構(gòu)體指針類型;通過所述結(jié)構(gòu)體類型定義模塊,并結(jié)合結(jié)構(gòu)體類型定義的條件,給出正確的結(jié)構(gòu)體類型定義;
[0015]步驟3,通過所述結(jié)構(gòu)體變量定義聲明模塊,用MSVL中的類型聲明語句定義結(jié)構(gòu)體變量,并聲明所述結(jié)構(gòu)體類型以及結(jié)構(gòu)體指針類型;引入類型后,每個變量都是先聲明再引用,聲明規(guī)定了變量的類型,這樣在其他語句中引用時,可以直接對變量進行解釋獲取變量的值的類型,從而提高程序執(zhí)行的效率。
[0016]步驟4,通過所述結(jié)構(gòu)體變量存儲模塊,根據(jù)所述結(jié)構(gòu)體變量所聲明的類型及其語義,將所述結(jié)構(gòu)體變量保存在MSVL符號表中,所述MSVL符號表為存放MSVL變量的表;
[0017]步驟5,在所述結(jié)構(gòu)體及結(jié)構(gòu)體指針類型賦值操作處理模塊中對所述結(jié)構(gòu)體類型以及結(jié)構(gòu)體指針類型進行賦值操作。
[0018]需要說明的是,所述步驟I中在基本數(shù)據(jù)類型中引入指針類型具體流程如下:
[0019]步驟1.1,所述基本數(shù)據(jù)類型集合用^表示,其中包括原始數(shù)據(jù)類型int floatchar、列表類型int〈>float〈>char〈>、數(shù)組類型int [] float [] char [];由于在類型聲明時,定義一個數(shù)組需要給定數(shù)組長度,比如:int[a]5,因此給定數(shù)組長度后的基本數(shù)據(jù)類型的集合用沒1表示,定義如下:
[0020]
Thd = {Int,float char, Int <>,float <>,char <>,
[0021]int [I], int [2], , float [I], float [2], , char [I], char [2],...};
[0022]并給出所述基本數(shù)據(jù)類型的論域
[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定義表示一種基本數(shù)據(jù)類型,其中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,對于每一種基本數(shù)據(jù)類型,引入指針類型,記作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在程序中出現(xiàn),其中Tm eyPk。因為每一個表達式要有確定的類型,所以下標Τ* 一般情況不能省略。只有在省略后不引起歧義的情況下才可以省略;
[0039]例如和 t2 分別代表 int* 和 char* 那么公式 h = NULLint* Λ t2 = NULLchar* 可以簡寫為L = NULL Λ t2 = NULL,這樣我們不可能誤以為是& = t2。
[0040]步驟1.7,在基本數(shù)據(jù)類型,已經(jīng)定義用Ist (.)來表示一種T類型,現(xiàn)在把指針類型仏^擴展進去;對于每一個指針類型,定義如下:
[0041 ] Zsr- T 1:并且(令',Γ) ηφ true.
[0042]其中,露是bool類型,上式解釋為,如果變量V是T類型,則為true,否則為false ;
[0043]步驟1.8,如下定義指針類型變量的聲明:
[0044]
Tx^ Isr{x}
[0045]其中,T
[0046]示例說明:
[0047]如圖2所示,用指針實現(xiàn)三個整數(shù)從大到小的排序。
[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,在指針類型的基礎(chǔ)上引入結(jié)構(gòu)體類型,用S表示結(jié)構(gòu)體類型,Ts,表示一個可數(shù)的結(jié)構(gòu)體類型集合,則有S E I;對每一種結(jié)構(gòu)體類型,用S*表示結(jié)構(gòu)體類型S的指針類型,則所述結(jié)構(gòu)體中指針類型的集合為及s = CS * Is Ε ?;
[0063]步驟2.2,初步定義結(jié)構(gòu)體為:
[0064]struct SlT^1,...,Tkak];
[0065]其中S e Ts.,k>-L.as,…,e IT1,…,Tk € TdXTs (\表示除去),V為所有變量名的集合,r*竺圮u Jpb u rsu;s,#為基本數(shù)據(jù)類型的集合,Tpt為指針類型的集合;所述結(jié)構(gòu)體類型S中的每一個成員ak分別對應(yīng)類型Tk ;
[0066]為了簡化這個理論,不允許結(jié)構(gòu)體嵌套,但是允許一個結(jié)構(gòu)體成員的指針指向另一個結(jié)構(gòu)體類型。這樣,就可以容易地定義鏈表、樹和圖等復雜數(shù)據(jù)類型。
[0067]步驟2.3,一旦定義好一個結(jié)構(gòu)體類型S,就可以用Sx來聲明一個新的結(jié)構(gòu)體類型變量,因此X就擁有的所有成員類型,可以用X.a來表示的每一個成員;同樣還可以定義一個結(jié)構(gòu)體指針類型S*t,其中eTpS,用t_> a來指向結(jié)構(gòu)體的成員a,結(jié)構(gòu)體指針類型
S*t為空指針,把t解釋為(NULL,S*),否則,把t解釋為(X,S*);綜上所述,結(jié)構(gòu)體指針類型的論域定義如下:
[0068]
2)ps ^CPu(NULL)) χ Tps.
[0069]步驟2.4,結(jié)構(gòu)體類型定義為struct S {1>1;..., Tkak],對于每一個類型的變量χ把它解釋為(見S ),其中# =(ak,(tv Tfc))];對于χ的論域其實就是它每一個成員變量論域的集合,其中涉及到基本數(shù)據(jù)類型域巧、指針類型域?#或者結(jié)構(gòu)體指針類型域2V;綜上所述,結(jié)構(gòu)體類型的論域定義如下:
[0070]
% 笙 FPF {V, Db U l}pb U Dps) χ Ts
[0071]可以得出為一個嵌套的二元組,其中FPF (E1, E2)表示從集合E1到集合E2所有的有限偏函數(shù),如下定義FPF:
[0072]
FPFCB1,E2) 4J (E)E c E1 χ I2)
[0073]其中,E是有限的,并且如果(u, V), (u, V' ) GE,那么V = V',即u和V是--
對應(yīng)的;
[0074]結(jié)構(gòu)體的基本操作是結(jié)構(gòu)體成員的存取。對每一個成員ae v,a表示結(jié)構(gòu)體成員的名字。定義“.a”來進行成員的存取操作。例如:假定e是一個結(jié)構(gòu)體類型,而a是它的一個成員,那么e.a就返回成員a。
[0075]所以,就有了如下定義:
[0076]
rr , ((V1T) SP*/fe] = ({...,(?(V,r)5}
11 e, aj = ^
V nil否則
[0077]之前在指針類型部分定義過一般指針的引用和解引用操作,對于結(jié)構(gòu)體指針類型同樣適用。例如:假定t是一個指向結(jié)構(gòu)體a的結(jié)構(gòu)體指針類型,用t- > a就可以返回a。
[0078]所以,就有了如下定義:
[0079]
t—> a = (* t).a
[0080]和基本數(shù)據(jù)類型指針一樣,在程序中我們也允許結(jié)構(gòu)體指針類型為空,表示為
NULLT*,其中T Tss。
[0081]結(jié)合之前的基本數(shù)據(jù)類型指針,我們可以把NULLw解釋為(NULL,T*),其中,+T ,同樣的,當下標τ*省略不會弓丨起歧義時可以省略。
[0082]步驟2.5,對于基本數(shù)據(jù)類型和指針類型有T eU 現(xiàn)在對其進行擴展,把結(jié)構(gòu)體類型引入就得到Ti;并且對于每一個Γ ETd,都有:
[0083]IsT: T ^3 并且(.化 Tl B true.
[0084]步驟2.6,由于結(jié)構(gòu)體類型的復雜性,用邏輯公式來進行結(jié)構(gòu)體的形式化定義和變量聲明并不是一件容易的事,所以不得不考慮一些細節(jié)問題:
[0085]首先,要考慮結(jié)構(gòu)體類型定義不合法的可能性。用下面的定義:
[0086]
S1..,,S7n *e Tps(tn > O)
[0087]來聲明結(jié)構(gòu)體S的成員。這種情況下,規(guī)定如果Si(l < i < m)的定義不遲于結(jié)構(gòu)體S的定義,結(jié)構(gòu)體S的定義就是合法的。否則,就不合法。
[0088]例如:在程序struct S1 {int a} AO (struct S2 (S1^a2I)中,S1 在 S2 之前定義,所以S2是合法的。另外一個程序struct S1 {S2*a} Λ struct S2IS1^aJ中,因為S1和S2是同時定義的,所以也是合法的。對于如何處理不合法的結(jié)構(gòu)體類型定義,一種自然的想法就是讓包含有不合法結(jié)構(gòu)體類型定義的不健康程序不可滿足,也就是說該程序不合法。
[0089]但是,這種方法不可行。對于程序struct來說,它本身就是不健康的程序,也就是說如果 struct S2 {Si*a2}是不滿足的,那么 struct S1 {S2*aJ Λ struct S2 (S1^a2I也就是不滿足的,但是實際又是滿足的,這就產(chǎn)生了矛盾。
[0090]為了解決這個矛盾,引入系統(tǒng)變量healthy,所述系統(tǒng)變量healthy為字符類型變量;所述變量healthy只有y和η兩個值,默認值為y (yes),在一些壞情況下設(shè)置為n (no);由于不允許在程序中出現(xiàn)一個顯示的系統(tǒng)變量,所以要求程序員不能修改healthy變量的值。為了處理這些不健康的程序,充分利用系統(tǒng)變量healthy重新規(guī)范地定義結(jié)構(gòu)體如下:
[0091]
struct SfTiGi,, Tk %} !S-^.healthy = 'n1)
[0092]其中P1.…Sm *} 二 Pl….,Tk) n.Tps。
[0093]步驟2.7,對于每一個結(jié)構(gòu)體類型S,引入rs表示它是否定義過:結(jié)構(gòu)體類型S—旦定義,rs就一直保持是true,只有S未定義前是false ;這是因為遵循MSVL極小模型語義的規(guī)則。在極小模型語義中,一個命題獨立于其他命題可以為真,也可以為假時,它被解釋為false ;如果struct SITa,..., Tkak]是不合法的,那么^卩玄€玄胃)在當前狀態(tài)為false,并且把變量healthy的值設(shè)置為η ;
[0094]步驟2.8,在結(jié)構(gòu)體變量χ擁有結(jié)構(gòu)體類型S同樣的成員以及類型時,則認為結(jié)構(gòu)體變量χ和結(jié)構(gòu)體類型S是一致的,即:
[0095]當結(jié)構(gòu)體S定義為struct Sl^a1,..., Tkak]時,χ被解釋為(令,幻,其中f = {{ K)},,(ak, (1?, Tk))];
[0096]步驟2.9,為了確保結(jié)構(gòu)體變量及其成員的一致性,在結(jié)構(gòu)體變量定義時記錄它每個成員的信息,然后用來限制每一個結(jié)構(gòu)體變量,因此引入一個系統(tǒng)變量mems定義為:
[0097]
mems eS {(a,,?,),...,{3--}^ ^ °>;
[0098]這樣得到一個特殊類型:
[0099]
MEMTYPE 笙 FPF(IJiJli^s).
[0100]其中MEMTYPE是用來記錄結(jié)構(gòu)體每個成員的信息;
[0101]步驟2.10,得出結(jié)構(gòu)體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,所述結(jié)構(gòu)體變量定義為一個嵌套的二元組;
[0106]步驟3.2,為了檢查結(jié)構(gòu)體變量和定義的一致性,定義一個斷言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,結(jié)合所述變量healthy給出結(jié)構(gòu)體類型以及結(jié)構(gòu)體指針類型的聲明如下:
[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]如果一個結(jié)構(gòu)體變量聲明Sx是合法的,一旦它被定義,rs就會一直保持,用
□Iss(X) Λ Cons (x,mems)來確保生成結(jié)構(gòu)體變量χ的類型和值和結(jié)構(gòu)體類型S保持一致;如果因為結(jié)構(gòu)體類型S沒有定義而導致Sx和S*x不合法,那么在當前狀態(tài)下rs為false,并且系統(tǒng)變量healthy設(shè)置為’ η’。
[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中對結(jié)構(gòu)體指針類型的賦值操作步驟如下:
[0129]對于賦值操作t = &x的執(zhí)行,流程如下:
[0130]步驟5.1.1,查找符號表,查看變量χ是否存在,如果存在,執(zhí)行步驟5.1.2,否則執(zhí)行步驟5.1.5 ;
[0131]步驟5.1.2,查找符號表,查看t是否為結(jié)構(gòu)體指針類型,如果是,執(zhí)行步驟5.1.3,否則執(zhí)行步驟5.1.5 ;
[0132]步驟5.1.3,判斷&x的類型和結(jié)構(gòu)體指針t類型是否相等,如果是,執(zhí)行步驟5.1.4,否則執(zhí)行步驟5.1.5 ;
[0133]步驟5.1.4,執(zhí)行操作t = &x ;
[0134]步驟5.1.5, I [t] ^ I [&x],向用戶提示t = &x不滿足。
[0135]對于賦值操作χ = *t的執(zhí)行,流程如下:
[0136]步驟5.2.1,查找符號表,看變量χ是否存在,如果存在,執(zhí)行步驟5.2.2,否則執(zhí)行步驟5.2.5 ;
[0137]步驟5.2.2,在符號表中查找t,首先看t是否是一個結(jié)構(gòu)體指針類型,如果是,然后再看*t的取值是否為數(shù)據(jù)域中的一個常量,如果是,執(zhí)行步驟5.2.3,否則執(zhí)行步驟
5.2.5 ;
[0138]步驟5.2.3,對變量χ的取值進行判斷,如果變量χ的取值為nil時,將*t的取值賦給X,使得X = *t等式滿足,賦值操作執(zhí)行成功,否則執(zhí)行步驟5.2.4 ;
[0139]步驟5.2.4,如果χ的取值不是nil,判斷χ的取值是否等于*t的取值,如果相等,那么等式滿足,賦值操作執(zhí)行成功,賦值操作流程結(jié)束,如果取值不相等,執(zhí)行步驟5.2.5 ;
[0140]步驟5.2.5, I [χ] ^ I [*t],向用戶提示x = 不滿足。
[0141]需要說明的是,所述步驟5中的結(jié)構(gòu)體類型的賦值操作步驟如下:
[0142]對于賦值操作χ = S.a的執(zhí)行,流程如下:
[0143]步驟5.3.1,查找符號表,看變量χ是否存在,如果存在,執(zhí)行步驟5.3.2,否則執(zhí)行步驟5.3.5 ;
[0144]步驟5.3.2,查找符號表,檢查變量S是否為結(jié)構(gòu)體類型,如果是,執(zhí)行步驟5.3.3,否則執(zhí)行步驟5.3.5 ;
[0145]步驟5.3.3,遍歷結(jié)構(gòu)體S的存儲鏈表,找出成員a所在項,如果查找成功,執(zhí)行步驟5.3.4,否則執(zhí)行步驟5.3.5 ;
[0146]步驟5.3.4,執(zhí)行操作χ = S.a ;
[0147]步驟5.3.5, I [x] ^ I [S.a],向用戶提示x = S.a不滿足。
[0148]對于賦值操作χ = t- > a的執(zhí)行,流程如下:
[0149]步驟5.4.1,查找符號表,看變量χ是否存在,如果存在,執(zhí)行步驟5.4.2,否則執(zhí)行步驟5.4.6 ;
[0150]步驟5.4.2,查找符號表,看t是否為結(jié)構(gòu)體指針類型,如果是,執(zhí)行步驟5.4.3,否則執(zhí)行步驟5.4.6 ;
[0151]步驟5.4.3,查找符號表,看t所指的變量是都為結(jié)構(gòu)體類型,如果是,執(zhí)行步驟
5.4.4,否則執(zhí)行步驟5.4.6 ;
[0152]步驟5.4.4,遍歷t所指的結(jié)構(gòu)體的存儲鏈表,找出成員a所在項,如果查找成功,執(zhí)行步驟5.4.5,否則執(zhí)行步驟5.4.6 ;
[0153]步驟5.4.5,執(zhí)行操作 χ = t- > a ;
[0154]步驟5.4.6, I [χ] ^ I [t_ > a],向用戶提示 x = t_ > a 不滿足。
[0155]本發(fā)明的有益效果在于:本發(fā)明在MVSL基本數(shù)據(jù)類型和指針類型的基礎(chǔ)上,擴展結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型,使得MSVL可以運用在包含更加復雜的數(shù)據(jù)類型的系統(tǒng)中,對系統(tǒng)進行建模、仿真和驗證,也使得MSVL和傳統(tǒng)編程語言之間的差距減小,使得MSVL更加的實用。
【專利附圖】
【附圖說明】
[0156]圖1為本發(fā)明的系統(tǒng)模塊構(gòu)成示意圖;
[0157]圖2為用指針實現(xiàn)三個整數(shù)從大到小排序示例示意圖;
[0158]圖3為鏈表逆置示例示意圖。
【具體實施方式】
[0159]以下將結(jié)合附圖對本發(fā)明作進一步的描述,需要說明的是,本實例以本技術(shù)方案為前提,給出了具體的實施方式,但并不限于本實施例。
[0160]如圖1所示,MSVL中結(jié)構(gòu)體及結(jié)構(gòu)體指針類型的擴展解釋系統(tǒng)及其擴展方法,所述系統(tǒng)包括如下模塊:
[0161]結(jié)構(gòu)體類型定義模塊:所述結(jié)構(gòu)體類型定義模塊包括結(jié)構(gòu)體類型的定義;
[0162]結(jié)構(gòu)體變量定義聲明模塊:所述變量定義聲明模塊包括所述變量聲明命令以及類型聲明定義;
[0163]結(jié)構(gòu)體變量存儲模塊:所述變量存儲模塊包含有變量類型標記和變量取值,所述變量類型標記根據(jù)變量聲明語句記錄該變量的類型,變量存儲兩邊的取值限制在其類型所對應(yīng)的論域內(nèi);
[0164]結(jié)構(gòu)體及結(jié)構(gòu)體指針類型賦值操作處理模塊:賦值操作的左操作數(shù)為變量,右操作數(shù)為表達式并對左操作數(shù)進行解釋。
[0165]基于上述系統(tǒng)的MSVL中結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型的擴展方法,實施步驟如下:
[0166]1、基本數(shù)據(jù)類型集合用Ta表示,包括:
[0167]①原始數(shù)據(jù)類型:int float char
[0168]②列表類型:int〈>float〈>char〈>
[0169]③數(shù)組類型:int[] float [] char []
[0170]2、由于在類型聲明時,定義一個數(shù)組需要給定數(shù)組長度,比如:int [a] 5。所以修改基本數(shù)據(jù)類型集合為巧:
[0171]
TJf 竺{intfsoatcharjnt 0.,float O,char O,
[0172]int [I],int [2], , float [I],float [2], , char [I],char [2], }
[0173]3、基本數(shù)據(jù)類型論域用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定義表示一種數(shù)據(jù)類型,其中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、對于每一種數(shù)據(jù)類型,引入指針類型,記作T*,而指針類型的集合用
;b 二 U * |r E Jy.表示;
[0183]7、指針類型的解釋需要一個合適的地址模型。一種可能性就是把地址模型當作是位置到值得映射,這種情況下,用”&X”符號來取得變量X的地址。但是這種方法不夠抽象,因為這依賴一些例如具體內(nèi)存地址的實現(xiàn)細節(jié)。為了使得實現(xiàn)更加靈活,可以把指針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在程序中出現(xiàn);其中。因為每一個表達式要有確定的類型,所以下標τ* 一般情況不能省略。只有在省略后不引起歧義的情況下才可以省略;
[0189]例如It1 和 t2 分別代表 int* 和 char*,那么公式 h = NULLint* Λ t2 = NULLchar* 可以簡寫為L = NULL Λ t2 = NULL,這樣我們不可能誤以為是& = t2。
[0190]12、在基本數(shù)據(jù)類型,已經(jīng)定義用IsT(.)來表示一種T類型?,F(xiàn)在把指針類型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、在指針類型的基礎(chǔ)上,在MSVL中引入結(jié)構(gòu)體(struct)類型,用S表示,表示一個可數(shù)的結(jié)構(gòu)體類型集合,即s e Ts;對每一種結(jié)構(gòu)體類型,用s*來表示結(jié)構(gòu)體s的指針類型,因此,所述結(jié)構(gòu)體中指針類型的集合可以表示為;={s HS e rs};
[0198]Mrd =圮U來表示基本數(shù)據(jù)類型、指針類型、結(jié)構(gòu)體類型和與之相關(guān)聯(lián)的指針類型的集合。這樣,就可以如下定義結(jié)構(gòu)體:
[0199]struct S (T1B1,...,Tkak}
[0200]其中S eap …,% e T1,…,Tk € Td\Ts (\ 表示除去);
[0201]這樣就定義了一個結(jié)構(gòu)體S,它的每一個成員ak分別對應(yīng)類型Tk。
[0202]為了簡化這個理論,不允許結(jié)構(gòu)體嵌套,但是允許一個結(jié)構(gòu)體成員的指針指向另一個結(jié)構(gòu)體類型。這樣,就可以容易地定義鏈表、樹和圖等復雜數(shù)據(jù)類型。
[0203]16、一旦定義好一個結(jié)構(gòu)體類型S,就可以用Sx來聲明一個新的結(jié)構(gòu)體類型變量。所以,X就擁有的所有成員類型,可以用X.a來表示的每一個成員。同樣還可以定義一個結(jié)構(gòu)體指針類型S*t,用t- > a來指向結(jié)構(gòu)體類型的成員a。
[0204]17、結(jié)構(gòu)體指針類型論域:和其他類型指針一樣,定義一個結(jié)構(gòu)體指針類型S*t eTps。如果為空指針,把t解釋為(NULL, S*)。否則,把t解釋為(χ, S*)。
[0205]綜上所述,結(jié)構(gòu)體指針類型的論域可以如下定義:
[0206]
Sps M (V U {NULL}) X Jps
[0207]18、結(jié)構(gòu)體論域:結(jié)構(gòu)體類型定義為struct Sl^a1,..., Tkak},對于每一個類型的變量χ把它解釋為(U),其中# = {( B1A^T1Y),..,JBkt Tk))]。所以,對于X的論域其實就是它每一個成員變量論域的集合,其中涉及到基本數(shù)據(jù)類型域2?、指針類型域或者結(jié)構(gòu)體指針類型域2^。
[0208]綜上所述,結(jié)構(gòu)體類型的論域可以如下定義:
[0209]
?s M FPF (V, D6 U Bp6 U Dps) x Ts
[0210]可以得出鳥為一個嵌套的二元組。其中,F(xiàn)PF(E1, E2)表示從集合E1到集合E2所有的有限偏函數(shù)。如下定義FPF:
[0211]
FPF(E1^2)M(E)Ec1B1XEsJ
[0212]其中,E是有限的,并且如果(u, V), (u, V' ) GE,那么V = V',即u和V是--
對應(yīng)的。
[0213]19、結(jié)構(gòu)體的操作:結(jié)構(gòu)體的基本操作是結(jié)構(gòu)體成員的存取。對每一個成貝a e V,a表示結(jié)構(gòu)體成員的名字。定義“.a”來進行成員的存取操作。假定e是一個結(jié)構(gòu)體類型,而a是它的一個成員,那么e.a就返回成員a。
[0214]所以,就有了如下定義:
[0215]
f [e a]= f (v,T)如果 i{e] = ({…,(a.,(y, t)\…},5)
3 I nil 否則
[0216]20、之前在指針類型部分定義過一般指針的引用和解引用操作,對于結(jié)構(gòu)體指針類型同樣適用。假定t是一個指向結(jié)構(gòu)體類型a結(jié)體指針類型,用t- > a就可以返回a。
[0217]所以,就有了如下定義:
[0218]
t—> a M {* t}.a.?
[0219]21、和基本數(shù)據(jù)類型指針一樣,在程序中我們也允許結(jié)構(gòu)體指針類型為空,表示為NULLt*,其中
[0220]結(jié)合之前的基本數(shù)據(jù)類型指針,我們可以把NULLw解釋為(NULL,T*),其中,Γ Jp6UJps,同樣的,當下標T*省略不會引起歧義時可以省略。
[0221]22、之前已經(jīng)定義過用IsT(.)表示一種T類型。對于基本數(shù)據(jù)類型和指針類型^TeT/ u Jpfco現(xiàn)在對其進行擴展,把結(jié)構(gòu)體類型引入就得到T氣并且對于每一個Γ eTd,都有
[0222]Is7: T ^3 并且(也 7} η true。
[0223]23、由于結(jié)構(gòu)體類型的復雜性,用邏輯公式來進行結(jié)構(gòu)體的形式化定義和變量聲明并不是一件容易的事,所以不得不考慮一些細節(jié)問題:
[0224]首先,要考慮結(jié)構(gòu)體類型定義不合法的可能性。用下面的定義:
[0225]
?^1 *'-.^oSrnC消—Oj
[0226]來聲明結(jié)構(gòu)體S的成員。這種情況下,規(guī)定如果Si(l < i < m)的定義不遲于結(jié)構(gòu)體S的定義,結(jié)構(gòu)體S的定義就是合法的。否則,就不合法。
[0227]例如:在程序struct S1 {int a} AO (struct S2 (S1^a2I)中,S1 在 S2 之前定義,所以S2是合法的。另外一個程序struct S1 {S2*a} Λ struct S2IS1^aJ中,因為S1和S2是同時定義的,所以也是合法的。
[0228]對于如何處理不合法的結(jié)構(gòu)體類型定義,一種自然的想法就是讓包含有不合法結(jié)構(gòu)體類型定義的不健康程序不可滿足,也就是說該程序不合法。但是,這種方法不可行。對于程序struct S2 (S1^a2I來說,它本身就是不健康的程序,也就是說如果struct S2 (S1^a2I是不滿足的,那么struct S1 {S2*aJ Λ struct S2 {SfaJ也就是不滿足的,但是實際又是滿足的,這就產(chǎn)生了矛盾。為了解決這個矛盾,引入一個系統(tǒng)變量字符類型變量healthy,healthy變量只有兩個值,y (yes)和n (no),默認值為y,只有在一些壞情況下,healthy值設(shè)置為η。我們不允許在程序中出現(xiàn)一個顯示的系統(tǒng)變量,所以我們要求程序員不能修改healthy變量的值。為了處理這些不健康的程序,我們充分利用系統(tǒng)變量healthy重新規(guī)范地定義結(jié)構(gòu)體如下:
[0229]
structSIT1 at,...fTkak] M OrjA(-1(? Λ …Ars ) -+ healthy = V)
[0230]其中{5:'...,Sra= [T1,...,Tk] n Tpso
[0231]24、對于每一個結(jié)構(gòu)體類型S,我們引入匕表示它是否定義過。S—旦定義,IV就一直保持是true,只有S未定義前是false。這是因為我們遵循MSVL極小模型語義的規(guī)則。在極小模型語義中,一個命題獨立于其他命題可以為真,也可以為假時,它被解釋為假;如果struct SiT1B1, , Tkak]是不合法的,那么1(1 ^ ^么叫在當前狀態(tài)為假,并且把healthy
變量的值設(shè)置為’η’。我們稱一個區(qū)間σ是健康的,當且定當區(qū)間對σ的每一個狀態(tài)都有:s[healthy] = (' y' ,char)。這樣,一個包含不合法結(jié)構(gòu)體類型定義的程序沒有一個健康的極小模型。
[0232]25、為了定義系統(tǒng)變量healthy,我們假定每一個程序P開始時,都用一個特別的公式initsys(p)來指定系統(tǒng)變量,整個程序就可以寫成initsys (ρ) Λ P。init sys (p)定義如下:
[0233]
initsys(p) = char healthy Λο(—IieaIlIiy = V)..^ ?
[0234]其中,initsys (p)表示p的初始化。rhMlthy表示之前沒有出現(xiàn)過,默認為'y'。
[0235]根據(jù)極小模型語義,沒有被賦值時為false ;那么,從上式就可以看出healthy變量默認值是’ y’,只有在出現(xiàn)一些例如不合法結(jié)構(gòu)體類型定義的壞情況下值才被改為’ η’。
[0236]26、我們需要依據(jù)結(jié)構(gòu)體成員以及他們的類型確保結(jié)構(gòu)體變量和結(jié)構(gòu)體類型定義的一致性。
[0237]在結(jié)構(gòu)體變量χ擁有結(jié)構(gòu)體類型S同樣的成員以及類型時,我們認為結(jié)構(gòu)體變量χ和結(jié)構(gòu)體類型S是一致的,也就是說:
[0238]當結(jié)構(gòu)體被定義為struct SlTp1,..., Tkak],χ被解釋為(脅J};其中
I* =71}),,,,, {Sjj, (1?.Tj-)} J0
[0239]27、為了確保一個結(jié)構(gòu)體變量和它成員的一致性,在結(jié)構(gòu)體變量定義時記錄它每個成員的信息,然后用來限制每一個結(jié)構(gòu)體變量。為此,再度引入一個系統(tǒng)變量mems,定義為:
[0240]
ITtems 鉭
[0241]這樣得到一個特殊類型:
[0242]
MEMTYPE ¥ FPF(ETdVTs)
[0243]其中MEMTYPE是用來記錄結(jié)構(gòu)體每個成員的信息。
[0244]28、下面給出結(jié)構(gòu)體的最終定義:
[0245]
striictStr, a,, Tkak} ? DfrsAmems =
CCa1-T11),…,Ca5r,Tk)})A(~,(rSiA…ArsJ healthy = V)
[0246]其中{5:'? - } = {V' Γ?}η Tps;當 k = O 時,常量{ (BijT1),…(akTk)}是空集
_,并且給出initsys (ρ)的最終規(guī)范定義:
[0247]
Initsys(p) = char heaIihy Λπt^y healthy — yf}
[0248]
= 0)Λ -AC-^rsjfi —= 0))
[0249]其中,S1,...,Sn都是程序p中出現(xiàn)過的結(jié)構(gòu)體。如果
[0250]某個Si未被定義,則初始化為0。
[0251]29、為了檢查結(jié)構(gòu)體變量和定義的一致性,定義一個斷言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]形式化表示必須區(qū)分變量聲明的合法與不合法。對于結(jié)構(gòu)體S,如果結(jié)構(gòu)體類型定義struct S{}不遲于變量聲明Sx或者S*,我們就稱之為合法的變量聲明,否則,為不合法的。
[0256]Sx Λ struct S{...}之前我們定義過一個包含不合法的結(jié)構(gòu)體類型定義的程序為不健康的程序,現(xiàn)在我們將其擴展為,一個包含不合法的結(jié)構(gòu)體類型定義或者不合法的變量聲明的程序,我們稱之為不健康的程序。換句話說就是一個健康的程序要求它結(jié)構(gòu)體類型定義和變量聲明都要合法。
[0257]和之前不合法的結(jié)構(gòu)體類型定義一樣,想要使一個包含不合法變量聲明的程序不可滿足,理論上也是不可實行的。為了處理這些不健康程序,結(jié)合系統(tǒng)變量healthy給出更規(guī)范的變量聲明:
[0258]
Sx !f rs then Iss((a;)ACons(^ iBems})else healthy = V
[0259]
5 If rs then Is5si {x) else healthy = Vt
[0260]如果一個結(jié)構(gòu)體變量聲明Sx是合法的,一旦它被定義,rs就會一直保持,用
□Iss(X) Λ Cons (X, mems)來確保生成變量χ的類型和值和結(jié)構(gòu)體S保持一致;如果因為結(jié)構(gòu)體S沒有定義而導致Sx和S*x不合法,那么在當前狀態(tài)下rs為false,并且系統(tǒng)變量healthy 設(shè)置為’ η,。
[0261]綜上,得出結(jié)論:
[0262]I) 一個包含不合法結(jié)構(gòu)體類型定義或者不合法變量聲明的不健康程序,沒有一個健康的極小模型。
[0263]2) 一個健康的程序沒有一個不健康的極小模型。
[0264]30、結(jié)構(gòu)體指針類型的賦值操作步驟如下:
[0265]30.1、對于賦值操作的t = &x執(zhí)行,流程如下:
[0266]步驟1,查找符號表,查看變量χ是否存在,如果存在,執(zhí)行步驟2,否則執(zhí)行步驟5 ;
[0267]步驟2,查找符號表,查看t是否為結(jié)構(gòu)體指針類型,如果是,執(zhí)行步驟3,否則執(zhí)行步驟5 ;
[0268]步驟3,判斷&x的類型和結(jié)構(gòu)體指針類型t是否相等,如果是,執(zhí)行步驟4,否則執(zhí)行步驟5 ;
[0269]步驟4,執(zhí)行操作t = &x ;
[0270]步驟5, I [χ]古I [*t],向用戶提示t = &x不滿足。
[0271]30.2、對于賦值操作χ = *t的執(zhí)行,流程如下:
[0272]步驟1,查找符號表,看變量χ是否存在,如果存在,執(zhí)行步驟2,否則執(zhí)行步驟5 ;
[0273]步驟2,在符號表中查找t,首先看t是否是一個結(jié)構(gòu)體指針類型,如果是,然后再看*t的取值是否為數(shù)據(jù)域中的一個常量,如果是,執(zhí)行步驟3,否則執(zhí)行步驟5 ;
[0274]步驟3,對變量χ的取值進行判斷,如果變量χ的取值為nil時,將*t的取值賦給X,使得x = *t等式滿足,賦值操作執(zhí)行成功,否則執(zhí)行步驟4 ;
[0275]步驟4,如果χ的取值不是nil,判斷χ的取值是否等于*t的取值,如果相等,那么等式滿足,賦值操作執(zhí)行成功,賦值操作流程結(jié)束,如果取值不相等,執(zhí)行步驟5 ;
[0276]步驟5, I [x] ^ I [*t],向用戶提示χ = *t不滿足。
[0277]31、對結(jié)構(gòu)體類型的賦值操作步驟如下:
[0278]31.1、對于賦值操作χ = S.a的執(zhí)行,流程如下:
[0279]步驟1,查找符號表,看變量χ是否存在,如果存在,執(zhí)行步驟2,否則執(zhí)行步驟5 ;
[0280]步驟2,查找符號表,檢查變量S是否為結(jié)構(gòu)體類型,如果是,執(zhí)行步驟3,否則執(zhí)行步驟5 ;
[0281]步驟3,遍歷結(jié)構(gòu)體S的存儲鏈表,找出成員a所在項,如果查找成功,執(zhí)行步驟4,否則執(zhí)行步驟5 ;
[0282]步驟4,執(zhí)行操作χ = S.a ;
[0283]步驟5, I [χ]古I [S.a]向用戶提示x = S.a不滿足。
[0284]31.2、對于賦值操作χ = t_ > a的執(zhí)行,流程如下:
[0285]步驟1,查找符號表,看變量χ是否存在,如果存在,執(zhí)行步驟2,否則執(zhí)行步驟6 ;
[0286]步驟2,查找符號表,看t是否為結(jié)構(gòu)體指針類型,如果是,執(zhí)行步驟3,否則執(zhí)行步驟6 ;
[0287]步驟3,查找符號表,看t所指的變量是都為結(jié)構(gòu)體類型,如果是,執(zhí)行步驟4,否則執(zhí)行步驟6 ;
[0288]步驟4,遍歷t所指的結(jié)構(gòu)體的存儲鏈表,找出成員a所在項,如果查找成功,執(zhí)行步驟5,否則執(zhí)行步驟6;
[0289]步驟5,執(zhí)行操作χ = t- > a ;
[0290]步驟6, I [x] ^ I [t- > a],向用戶提示x = t_ > a不滿足。
[0291]對于本領(lǐng)域的技術(shù)人員來說,可以根據(jù)上述的技術(shù)方案和構(gòu)思,給出各種相應(yīng)的改變和變形,而所有的這些改變和變形都應(yīng)該包括在本發(fā)明權(quán)利要求的保護范圍之內(nèi)。
【權(quán)利要求】
1.MSVL中結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型的擴展解釋系統(tǒng),其特征在于,所述系統(tǒng)包括如下模塊: 結(jié)構(gòu)體類型定義模塊:所述結(jié)構(gòu)體類型定義模塊包括結(jié)構(gòu)體類型的定義; 結(jié)構(gòu)體變量定義聲明模塊:所述結(jié)構(gòu)體變量定義聲明模塊包括變量聲明命令以及類型聲明定義; 結(jié)構(gòu)體變量存儲模塊:所述結(jié)構(gòu)體變量存儲模塊包含有變量類型標記和變量取值,所述變量類型標記根據(jù)變量聲明語句記錄變量的類型,變量存儲兩邊的取值限制在其類型所對應(yīng)的論域內(nèi); 結(jié)構(gòu)體及結(jié)構(gòu)體指針類型賦值操作處理模塊:賦值操作的左操作數(shù)為變量,右操作數(shù)為表達式并對左操作數(shù)進行解釋。
2.一種根據(jù)權(quán)利要求1的MSVL中結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型的擴展方法,其特征在于,所述方法包括如下步驟: 步驟1,對于MSVL中的基本數(shù)據(jù)類型引入指針類型; 步驟2,在指針類型的基礎(chǔ)上引入結(jié)構(gòu)體類型,擴展出結(jié)構(gòu)體及結(jié)構(gòu)體指針類型;通過所述結(jié)構(gòu)體類型定義模塊,并結(jié)合結(jié)構(gòu)體類型定義的條件,給出正確的結(jié)構(gòu)體類型定義;步驟3,通過所述結(jié)構(gòu)體變量定義聲明模塊,用MSVL中的類型聲明語句定義結(jié)構(gòu)體變量,并聲明所述結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型; 步驟4,通過所述結(jié)構(gòu)體變量存儲模塊,根據(jù)所述結(jié)構(gòu)體變量所聲明的類型及其語義,將所述結(jié)構(gòu)體變量保存在MSVL符號表中; 步驟5,在所述結(jié)構(gòu)體及結(jié)構(gòu)體指針類型賦值操作處理模塊中對所述結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型進行賦值操作。
3.根據(jù)權(quán)利要求2所述的MSVL中結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型的擴展方法,其特征在于,所述步驟I中在基本數(shù)據(jù)類型中引入指針類型具體流程如下: 步驟1.1,所述基本數(shù)據(jù)類型集合用^表示,其中包括原始數(shù)據(jù)類型int float char、列表類型int〈>float〈>char〈>、數(shù)組類型int [] float [] char [],則給定數(shù)組長度的基本數(shù)據(jù)類型集合用交表示,定義如下:
int [I],int [2],…,float [I],float [2],…,char [I],char [2],…}; 并給出所述基本數(shù)據(jù)類型的論域
Float [] U Char U CharO U Char []; 其中:
步驟1.2,用Ist定義表示一種基本數(shù)據(jù)類型T,從而得到類型聲明公式:IsrCt); 其中re#; 步驟1.3,定義一個解釋I [e]來表示變量e類型化的值,其中,eD6U[mT}, nil表示變量還未定義; 步驟1.4,對于每一種基本數(shù)據(jù)類型,引入指針類型,記作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,在基本數(shù)據(jù)類型,已經(jīng)定義用Ist (.)來表示一種T類型,現(xiàn)在把指針類型擴展進去;對于每一個『eJVb,定義如下:isr.T — 3 并且(也打 B tme.其中,3是bool類型,上式解釋為,如果變量V是T類型,則為true,否則為false ; 步驟1.8,如下定義指針類型變量的聲明:T X = Isr Cr)
, 其中,T eTpto
4.根據(jù)權(quán)利要求2所述的MSVL中結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型的擴展方法,其特征在于,所述步驟2中具體流程如下: 步驟2.1,在指針類型的基礎(chǔ)上引入結(jié)構(gòu)體類型,用S表示結(jié)構(gòu)體類型,Ts表示一個可數(shù)的結(jié)構(gòu)體類型集合,則有S E I;對每一種結(jié)構(gòu)體類型,用S*表示結(jié)構(gòu)體類型S的指針類型,則所述結(jié)構(gòu)體類型中指針類型的集合為Tps = (S *■:S E Ts); 步驟2.2,初步定義結(jié)構(gòu)體類型為: struct S (I^a1,..., Tkak}; 其中S € 么Ib1," e VsT1廣、Tk € Td\Ts (\表示除去),V為所有變量名的集合,” =u ^ u ‘;所述結(jié)構(gòu)體類型S中的每一個成員ak分別對應(yīng)類型Tk ; 步驟2.3,定義好一個結(jié)構(gòu)體類型S之后,用Sx來聲明一個新的結(jié)構(gòu)體變量,這樣X就擁有的所有成員類型,用X.a來表示的每一個成員;定義一個結(jié)構(gòu)體指針類型S*t其中S#t e7P,用t- > a來指向結(jié)構(gòu)體類型的成員a ;如果結(jié)構(gòu)體指針類型S*t為空指針,把t解釋為(NULL,S*),否則,把t解釋為(x,S*);結(jié)構(gòu)體指針類型的論域定義如下:Dps 5 (V U {NULL}) X Tm.步驟2.4,結(jié)構(gòu)體類型的論域定義如下:Ds 竺 FPF (V, Vi U Dpi U Dps) X Ts 可以得出取為一個嵌套的二元組,其中FPF(E1, E2)表示從集合E1到集合E2所有的有限偏函數(shù),如下定義FPF:FPF(£,.£2) = [Εβ c £, X E2J.其中,E是有限的,并且如果(u,V),(u,v' ) GE,那么v = v',即u和V是一一對應(yīng)的; 步驟2.5,對于基本數(shù)據(jù)類型和指針類型有T eT/ UTfrt,現(xiàn)在對其進行擴展,把結(jié)構(gòu)體類型引入就得到P;并且對于每一個:T e 都有
Isr.T -*m并且(?T) B true.步驟2.6,引入系統(tǒng)變量healthy,所述系統(tǒng)變量healthy為字符類型變量;所述變量healthy只有y和η兩個值,默認值為y,在一些壞情況下設(shè)置為η ; 步驟2.7,對于每一個結(jié)構(gòu)體類型S,引入rs表示它是否定義過:結(jié)構(gòu)體S —旦定義,rs就一直保持是true,只有S未定義前是false ;如果struct Sl^a1,..., TKak}是不合法的,那么<叫在當前狀態(tài)為false,并且把變量healthy的值設(shè)置為’ η’ ; 步驟2.8,在結(jié)構(gòu)體變量X擁有結(jié)構(gòu)體類型S同樣的成員以及類型時,則認為結(jié)構(gòu)體變量X和結(jié)構(gòu)體類型S是一致的,即: 當結(jié)構(gòu)體類型S定義為struct S {1>1;..., Tkak}時,χ被解釋為(_=_ S ),其中# = {( TJ}, (ak, (1?, Tb ))]; 步驟2.9,為了確保結(jié)構(gòu)體變量及其成員的一致性,在結(jié)構(gòu)體變量定義時記錄它每個成員的信息,然后用來限制每一個結(jié)構(gòu)體變量,因此引入一個系統(tǒng)變量mems,定義為:腳ns 變{(a;?r.),> O); 這樣得到一個特殊類型:MEMTYPE 笙 FPF(1^J?\JS).其中MEMTYPE是用來記錄結(jié)構(gòu)體每個成員的信息; 步驟2.10,得出結(jié)構(gòu)體類型S的最終定義:
struct SCriS2, ?…TkBk] = ο {r5/\meiiis-=--^-- …,(?, 4)})/\(-(rStA-ArsJ — Wealthy = V);其中{S,* } = {Γ,, — ,Γ^Ιη Jpj,當 k = 0 時,IXa1, T1),...(akTk)}是空集0。
5.根據(jù)權(quán)利要求2所述的MSVL中結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型的擴展方法,其特征在于,所述步驟3的具體流程為: 步驟3.1,所述結(jié)構(gòu)體變量定義為一個嵌套的二元組; 步驟3.2,為了檢查結(jié)構(gòu)體變量和定義的一致性,定義一個斷言&)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,結(jié)合所述系統(tǒng)變量healthy給出結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型的聲明如下:Sx M if rs then □ lss((?ii)ACons(;r, mems))else healthy = 'nr
S * X= if T5 then Iss, (β} else health)' = 'n1- 如果一個結(jié)構(gòu)體變量聲明Sx是合法的,一旦它被定義,rs就會一直保持,用□Iss(X) Λ Cons (x,mems)來確保生成結(jié)構(gòu)體變量χ的類型和值和結(jié)構(gòu)體類型S保持一致;如果因為結(jié)構(gòu)體類型S沒有定義而導致Sx和S*x不合法,那么在當前狀態(tài)下rs為false,并且系統(tǒng)變量healthy設(shè)置為’ η’。
6.根據(jù)權(quán)利要求2所述的MSVL結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型的擴展方法,其特征在于,所述步驟5中對結(jié)構(gòu)體指針類型的賦值操作步驟如下: 對于賦值操作t = &X的執(zhí)行,流程如下: 步驟5.1.1,查找符號表,查看變量χ是否存在,如果存在,執(zhí)行步驟5.1.2,否則執(zhí)行步驟 5.1.5 ; 步驟5.1.2,查找符號表,查看t是否為結(jié)構(gòu)體指針類型,如果是,執(zhí)行步驟5.1.3,否則執(zhí)行步驟5.1.5 ; 步驟5.1.3,判斷&x的類型和結(jié)構(gòu)體指針t的類型是否相等,如果是,執(zhí)行步驟5.1.4,否則執(zhí)行步驟5.1.5 ; 步驟5.1.4,執(zhí)行操作t = &x ; 步驟5.1.5, I [t] ^ I [& χ],向用戶提示t = &x不滿足; 對于賦值操作χ = *t的執(zhí)行,流程如下: 步驟5.2.1,查找符號表,看變量χ是否在存在,如果存在,執(zhí)行步驟5.2.2,否則執(zhí)行步驟 5.2.5 ; 步驟5.2.2,在符號表中查找t,首先看t是否是一個結(jié)構(gòu)體指針類型,如果是,然后再看*t的取值是否為數(shù)據(jù)域中的一個常量,如果是,執(zhí)行步驟5.2.3,否則執(zhí)行步驟5.2.5 ; 步驟5.2.3,對變量χ的取值進行判斷,如果變量χ的取值為nil時,將*t的取值賦給χ使得χ = *t等式滿足,賦值操作執(zhí)行成功,否則執(zhí)行步驟5.2.4 ; 步驟5.2.4,如果χ的取值不是nil,判斷χ的取值是否等于*t的取值,如果相等,那么等式滿足,賦值操作執(zhí)行成功,賦值操作流程結(jié)束,如果取值不相等,執(zhí)行步驟5.2.5 ; 步驟5.2.5, I [x] ^ I [*t],向用戶提示χ = 不滿足。
7.根據(jù)權(quán)利要求2所述的MSVL中結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型的擴展方法,其特征在于,所述步驟5中的結(jié)構(gòu)體類型的賦值操作步驟如下: 對于賦值操作χ = S.a的執(zhí)行,流程如下: 步驟5.3.1,查找符號表,看變量χ是否存在,如果存在,執(zhí)行步驟5.3.2,否則執(zhí)行步驟.5.3.5 ; 步驟5.3.2,查找符號表,檢查變量S是否為結(jié)構(gòu)體類型,如果是,執(zhí)行步驟5.3.3,否則執(zhí)行步驟5.3.5 ; 步驟5.3.3,遍歷結(jié)構(gòu)體類型S的存儲鏈表,找出成員a所在項,如果查找成功,執(zhí)行步驟5.3.4,否則執(zhí)行步驟5.3.5 ; 步驟5.3.4,執(zhí)行操作χ = S.a ; 步驟5.3.5, I [x] ^ I [S.a],向用戶提示x = S.a不滿足; 對于賦值操作χ = t- > a的執(zhí)行,流程如下: 步驟5.4.1,查找符號表,看變量是否存在,如果存在,執(zhí)行步驟5.4.2,否則執(zhí)行步驟.5.4.6 ; 步驟5.4.2,查找符號表,看t是否為結(jié)構(gòu)體指針類型,如果是,執(zhí)行步驟5.4.3,否則執(zhí)行步驟5.4.6 ; 步驟5.4.3,查找符號表,看t所指的變量是否為結(jié)構(gòu)體類型,如果是,執(zhí)行步驟5.4.4,否則執(zhí)行步驟5.4.6 ; 步驟5.4.4,遍歷t所指的結(jié)構(gòu)體的存儲鏈表,找出成員a所在項,如果查找成功,執(zhí)行步驟5.4.5,否則執(zhí)行步驟5.4.6 ; 步驟5.4.5,執(zhí)行操作χ = t- > a ; 步驟5.4.6, I [χ]古I [t- > a],向用戶提示x = t_ > a不滿足。
【文檔編號】G06F9/44GK104182216SQ201410334324
【公開日】2014年12月3日 申請日期:2014年7月15日 優(yōu)先權(quán)日:2014年7月15日
【發(fā)明者】王小兵, 孫濤, 段振華, 趙亮, 田聰, 張南 申請人:西安電子科技大學