国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      Msvl中結(jié)構(gòu)體以及結(jié)構(gòu)體指針類型的擴展解釋系統(tǒng)及其擴展方法

      文檔序號:6620056閱讀:400來源:國知局
      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ā)明者】王小兵, 孫濤, 段振華, 趙亮, 田聰, 張南 申請人:西安電子科技大學
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1