2.1.9 ACCENT中局部變量定義(Rule Prelude)
規則中使用的屬性變量都不需定義.如果想在語義動作內聲明其它變量即局部變量,則分下面兩種情況:
1). 該變量只對某一分支可見
如 demo:
{int i=0;} alt_1
| alt_2 ;
2). 對規則內所有分支可見(但對其它規則不可見)
demo:
%prelude {int i=0;}
alt_1 |
alt_2
2.2 測試用例生成系統的總體結構
說明:
1. 系統讀入用SOOL編寫的源程序,這個程序存在一個文本文件上.
2. 作預處理.找到源程序中所有的WHILE語句,轉化成三個IF語句,并填加循環標記.
3. 詞法分析.使用工具FLEX,使源程序生成TOKEN序列.
4. 語義分析和生成語法樹.根據文法表達和語義信息,建立SOOL語言的語法樹,這樣,讀入程序后,可在語法樹上識別和存儲程序中的各個部分,所有的葉結點存儲的即是程序源代碼的TOKEN序列.
5. 類覆蓋的路徑查找處理.按照條件組合覆蓋策略,類覆蓋策略和路徑覆蓋策略,在SOOL語法樹上靜態查找程序可能執行到的路徑.大體上細分為:
5.1 基本數據結構的建立與使用.基本數據結構是指五種表:類信息表,對象生存期表,變量信息表,函數信息表,輸入變量表.
5.2 賦值,發消息語句處理.解決賦值,發消息語句對變量,函數以及對類的影響.
5.3 IF,WHILE語句處理.IF語句是產生執行分支的重要語句,根據IF語句的判斷條件,尋找可能產生分支的判斷.WHILE語句已經由預處理替換成帶有循環標記的IF語句,要針對不同的情況分析其對判斷條件的影響.
5.4 嵌套函數展開及處理.嵌套函數可出現在賦值語句,發消息語句以及IF語句的判斷條件中;嵌套的函數可能是類中的函數,也可能是某個父類中的函數,要針對不同的情況,使用函數展開所需的函數展開棧進行處理.
5.5 路徑二叉樹的建立與使用.由IF語句產生的分支連在一起就組成了若干程序可能執行到的路徑,用二叉樹的方式把這些分支存下來,遍歷二叉樹就得到了所有的路徑.
5.6 條件表達式的化簡.在每一條路徑上存在數個判斷條件,經過代入計算,得到輸入變量之間的條件表達式,化簡至規范的形式.
6. 測試用例的生成.對每條路徑上判斷條件進行分類,對不同的類,按不同的策略生成測試用例.大體上細分為:
6.1 表達式梯度值的計算.對路徑上條件判斷表達式進行偏微分計算,結果為方向導數值,得到各表達式的梯度.
6.2 大于(等于)關系測試用例生成.對路徑上條件判斷表達式中為大于或大于等于關系的由梯度值生成測試用例.
6.3 等于關系測試用例生成.對路徑上條件判斷表達式中為等于關系的,按一元方程取相反數,二元方程用求根公式的方法生成測試用例.
6.4 用例回代變量鏈表求值.按一個條件判斷表達式生成的用例,需要回代入后面的表達式中,檢查是否滿足.只有滿足一條路上所有判斷表達式的一組值,才是一條路上的測試用例.
6.5 回溯及遍歷的控制.處理兩種情況,一種是條路上到某一判斷表達式不能滿足的情況;另一種是一條路處理完畢,進行下一條路的處理,直至遍歷.
7. 輸出生成的測試用例結果.結果表示將以若干組輸入值的形式給出,每一組輸入值對應執行一條路徑.
第三章 SOOL的語法樹結構
3.1 SOOL的語法樹
3.1.1抽象語法樹與中間代碼
測試用例生成系統面對的是一個SOOL文本源程序(經詞法分析程序FLEX詞法分析后生成TOKEN序列,但其結構與源程序相同),要對源程序進行分析必須將其轉換成中間表示形式.抽象語法樹(AGT)是用于代碼生成的最一般的中間代碼形式,主要用來表示語句中出現的表達式.
某些語言需要多遍掃描,以便檢查靜態語義,這是因為該語言允許使用在定義之前.為了實現方便,我們規定SOOL不可以使用在前定義在后.對于使用在前定義在后的情形,第一遍掃描可以進行語法和詞法分析,并建立抽象語法樹和符號表;第二遍掃描可進行屬性的計算和靜態語義檢查;再通過簡單的樹遍歷,可進行獨立于機器的優化,它是樹到樹的轉換;最后,通過樹遍歷可直接產生目標代碼,或產生更適合實際代碼生成器或優化器的不同表示.
抽象語法樹可使用于語義分析,中間代碼優化和代碼生成等方面.實際上,它的應用可以更為廣泛.很多Ada實現都基于實際的抽象語法表示,稱之為Diana.它的目的不僅僅在于編譯器描述,而且還在于描述分別編譯單位(包和過程)程序庫的表示和作為其它的工具間公共界面.我們稱Diana是抽象語法表示,而不稱之為抽象語法樹表示,原因是它是一個DAG而不是樹.DAG實際上是從AGT發展而來的,其主要優點是能夠描述共享問題.④
假設有e = a * b + c * d 則其抽象語法樹如下圖:
三元式,四元式和抽象語法樹之間存在著簡單的互換性,其中抽象語法樹的特點是沒有固定計算順序,而三元式和四元式則不同,故抽象語法樹更具有一般性.
3.1.2 SOOL的語法樹結構
SOOL語法樹的主要部分結點結構:
1. SOOL程序由三部分組成:預包含部分,類部分和主函數部分.程序結點結構如下:
其中標識為整型;其它三部分為指針,指向程序中各個部分.
2. 主函數部分結點結構如下:
其中標識為整型;返回值類型為整型或布爾型;語句部分為指針,它指向主函數語句塊.
3. 預包含部分結點結構如下:
其中標識為整型;頭文件名為字符型.
4. 類部分結點結構如下:
其中標識為整型;本類名為字符型;父類名為字符型,前面有訪問控制符,是直接父類;類體部分指針,指向類中語句塊.
5. 主函數語句塊結構如下:
其中標識為整型;函數聲明部分為指針,指向函數聲明語句;語句塊為指針,指向主函數語句.主函數語句分為賦值語句,IF語句,WHILE語句,輸入輸出語句,類函數調用語句以及空語句.
6. 類中語句塊結點結構如下:
其中標識為整型;訪問控制符為指針,指向PUBLIC,PROTECTED或PRIVATE;類函數聲明部分為指針,指向類中的函數聲明語句;類語句塊為指針,指向類中語句.類中語句分為賦值語句,IF語句,WHILE語句,類函數調用語句以及空語句.
7. 函數聲明部分結點結構如下:
其中標識為整型;類型為指針,指向類型結構;變量為指針,指向變量結構.
8. 賦值語句結點結構如下:
其中標識為整型;變量為指針,指向變量結構;表達式為指針,指向表達式結構.
9. IF語句結點結構如下:
其中標識為整型;表達式為指針,指向表達式結構;語句塊1為指針,指向語句塊結構,這是當表達式為真時執行的語句塊;語句塊2為指針,指向語句塊結構,這是當表達式為假時執行的詩句塊.
10. WHILE語句結點結構如下:
其中標識為整型:表達式為指針,指向表達式結構;語句塊為指針,指向語句塊結構.在本文中,由于進行了預處理,WHILE語句全都被替換成帶有循環標志的IF語句,這一部分實際沒有用到.
11. 類函數發消息語句結點結構如下:
其中標識為整型;類名為字符串型;函數名為字符串型;實參表為指針,指向函數發消息實參表結構.
12. 輸入語句結點結構如下:
其中標識為整型;輸入變量表為指針,指向輸入變量表結構.
13. 輸出語句結點結構如下:
其中標識為整型;輸出變量表為指針,指向輸出變量表結構.
14. 表達式結點是一個聯合體,其結構如下:
其中標識為整型;簡單表達式為指針,指向簡單表達式結構;關系表達式為指針,指向關系表達式結構;布爾表達式為指針,指向布爾表達式結構.
15. 關系表達式結點結構如下:
其中標識為整型;表達式1為指針,指向表達式結構;關系操作符為指針,指向關系操作符結構;表達式2為指針,指向表達式結構.
16. 布爾表達式結點結構如下:
其中標識為整型;表達式1為指針,指向表達式結構;布爾操作符為指針,指向布爾操作符結構;表達式2為指針,指向表達式結構.
17. 簡單表達式結構如下:
其中標識為整型;正負號為指針,指向正負號結構;項1為指針,指向乘除表達式結構;加減操作符為指針,指向加減操作符結構;項2為指針,指向乘除表達式結構.
文章來源于領測軟件測試網 http://www.kjueaiud.com/