Cấu trúc thành phần chuyển đổi từ FSP sang LF

Một phần của tài liệu Nghiên cứu khả năng chuyển đổi giữa các đặc tả hình thức và ứng dụng trong kiểm chứng phần mềm (Trang 41)

5 Thực nghiệm

4.2Cấu trúc thành phần chuyển đổi từ FSP sang LF

FSP Compiler. Các thành phần trong dữ liệu đầu vào sẽ được chuyển đổi từ danh sách các hàm chuyển trạng thái sang kiểu dữ liệu LF bởi Thuật toán 4.1.

Danh sách list_transitions gồm các phần tử có định dạng là (start_state, list_sub_trans). Trong đó, start_state là trạng thái ban đầu, list_sub_trans là danh sách các tiến trình con. Tiến trình con này được định nghĩa bởi một nhãn và một trạng thái kết thúc –stop_state. Tương ứng với mỗi tiến trình con, ta thu được một phần tử gồm ba thành phần: (start_state, label, stop_state). Phần tử này chính là một hàm chuyển trạng thái. Phần tử khởi tạo là trạng thái bắt đầu

của hàm dịch chuyển đầu tiên trong danh sách list_transitions. Danh sách các

trạng tháil_statesđược xác định tại các dòng 3, 4 và 8, 9 của thuật toán. Tại các bước này, một trạng thái xuất hiện sẽ được kiểm tra. Nếu trạng thái này là trạng

thái mới thì nó được thêm vào danh sách l_states. Các hàm chuyển trạng thái

được thêm vào danh sáchl_transtại dòng 7 trong Thuật toán 4.1. FSP M biểu diễn một kênh truyền tin được đặc tả như Hình 4.3.

S0 = (ack2,ack1→ S0 | snd1→ S1 | snd2→ S2), S1 = (snd2,snd1,out1,ack2→S0), S2 = (snd2,snd1,out2,ack1→S0). Hình 4.3: FSP M.

Dựa vào việc phân tích từ vựng và phân tích cú pháp của M ta thu được list_transitions chứa các phần tử có kiểu là (start_state, list_sub_trans).

Chương 4.Chuyển đổi giữa các dạng biểu diễn của LTS

Thuật toán 4.1Thuật toán chuyển đổi FSP sang LF.

Đầu vào: list_transitions là danh sách các tiến trình con.

Đầu ra: listing_form là kiểu dữ liệu LF.

1: Khởi tạo l_states = empty, l_trans = empty, init_state = null {l_ states là danh sách rỗng chứa các trạng thái, l_ trans là danh sách rỗng chứa các hàm chuyển trạng thái, init_state là trạng thái khởi tạo}

2: for all(start_state, list_sub_trans) in list_transitionsdo

3: ifl_states.exists(start_state) = falsethen

4: l_states.add(start_state) {thêm phần tử start_state vào danh sách l_states}

5: end if

6: for all(label, stop _state) in list_sub_transdo

7: l_trans.add((start_state, label, stop_state)) {thêm phần tử (start_state, la- bel, stop_state) vào danh sách l_trans}

8: ifl_states.exists(stop_state) = falsethen

9: l_states.add(stop_state) {thêm phần tử stop_state vào danh sách

l_states}

10: end if

11: end for

12: end for

13: (init, tail) = list_transitions.head() {lấy phần tử đầu danh sách

list_transitions}

14: init_state = init {gán init_state bằng init}

15: return new listing_form(init_state, l_states, l_trans) {trả về một đối tượng listing_form}

Chương 4.Chuyển đổi giữa các dạng biểu diễn của LTS Đầu vào: Danh sách list_transitions có các phần tử: [ (S0, [("ack2, ack1", S0), ("sdn1", S1), ("sdn2", S2)]), (S1, [("sdn2, sdn1, out1, ack2", S0)]), (S2, [("sdn2, sdn1, out2, ack1", S0)]) ] Các bước thực hiện: 1: Bước 1:

2: Khởi tạo các biến: (adsbygoogle = window.adsbygoogle || []).push({});

3: l_states = empty: là danh sách rỗng chứa các trạng thái

4: l_trans = empty: là danh sách rỗng chứa các hàm dịch chuyển

5: init_state = null: là trạng thái khởi tạo 6: Bước 2:

7: Duyệt danh sách list_transitions

8: Phần tử (S0, [("ack2, ack1", S0), ("sdn1", S1), ("sdn2", S2)]): 9: Thêm S0 và l_states

10: Gán list_sub_trans = [("ack2, ack1", S0), ("sdn1", S1), ("sdn2", S2)] 11: Duyệt danh sách list_sub_trans

12: Phần tử ("ack2, ack1", S0)

13: Thêm phần tử (S0, "ack2, ack1", S0) và l_trans

14: Tương tự đối với 2 phần tử ("sdn1", S1) và ("sdn2", S2) 15: Tương tự với 2 phần tử (S1, [("sdn2, sdn1, out1, ack2", S0)])

và (S2, [("sdn2, sdn1, out2, ack1", S0)]) 16: Bước 3:

17: Gán (init, tail) = List.hd (list_transitions)⇒init = S0 18: Gán init_state = S0

19: Bước 4:

Chương 4.Chuyển đổi giữa các dạng biểu diễn của LTS

4.1.2 Thiết kế

Mô hìnhFSP Compiler được mô tả bởi Hình 4.4. Trong mô hình 4.4 có 3 thành

phần chính là:Lexical Analyzer,ParserTransitions Generator.FSP Compilersẽ có chức năng xử lý dữ liệu FSP đầu vào qua các bước phân tích từ vựng, phân tích cú pháp và sinh các chuyển trạng thái để đưa ra một danh sách cáctransitions.

Hình 4.4: Mô hình FSP Compiler.

Bước phân tích từ vựng được thực hiện bởi thành phần Lexical Analyzer

dưới sự hỗ trợ của Ocamllex. Lexical Analyzer cho kết quả đầu ra là các tokens. Các tokens là dữ liệu đầu vào của thành phần Parser. Bước phân tích cú pháp

được thực hiện bởi thành phầnParser.Parsersử dụngOcamlyaccđể hỗ trợ công

việc này. Parser sinh ra cây cú pháp tương ứng với dữ liệu FSP đầu vào. Cây

cú pháp được xử lý bởi thành phần Transitions Generator để sinh ra danh sách

chuyển trạng tháitransitions. Thành phần Transitions Generatorđược cài đặt dựa trên Thuật toán 4.1.

4.1.3 Phân tích đánh giá

Thuật toán 4.1 có tính dừng. Tham số đầu vào của Thuật toán 4.1 là một danh sáchlist_transitions. FSP là một máy hữu hạn trạng thái nên list_transitions là một danh sách hữu hạn phần tử. Thuật toán 4.1 sẽ kết thúc khi toàn bộ phần tử củalist_transitionsđược duyệt.

Phương pháp chuyển đổi từ FSP sang LF đã đặc tả và xử lý hoàn chỉnh đặc tả của ngôn ngữ FSP. Tuy nhiên, phương pháp này chưa được kiểm thử để đánh giá lỗi. Nhưng với sự hỗ trợ của công cụLTSA, chúng ta có thể so sánh được kết

Chương 4.Chuyển đổi giữa các dạng biểu diễn của LTS

4.2 Chuyển đổi LF sang FSP

4.2.1 Ý tưởng

Hệ thống sẽ cài đặt một thành phần được gọi là LF2FSP. Thành phần này có (adsbygoogle = window.adsbygoogle || []).push({});

chức năng chuyển đổi dữ liệu từ LF sang FSP. Bài toán chuyển đổi từ LF sang FSP được mô tả như Hình 4.5.

Hình 4.5: Cấu trúc thành phần chuyển đổi từ LF sang FSP.

AGTool sinh ra giả định dưới dạng LF và được thành phần LF2FSPxử lý.

Kết quả đầu ra của thành phầnLF2FSPlà dữ liệu FSP. Thành phần LF2FSPcài

Chương 4.Chuyển đổi giữa các dạng biểu diễn của LTS

Thuật toán 4.2Thuật toán chuyển đổi LF sang FSP.

Đầu vào: list_transitions là danh sách các hàm chuyển trạng thái, list_states là danh sách các trạng thái.

Đầu ra: fsp_str là chuỗi kí tự biểu diễn một FSP.

1: Khởi tạo fsp_str = null, count = 0, i = 0, tmp = empty

2: {khởi tạo xâu fsp_str rỗng, khởi tạo biến đếm count và i bằng 0, khởi tạo xâu tmp rỗng}

3: for allstate in list_statesdo

4: count := 0

5: tmp := null

6: for all(start_state, transition_label, stop_state) in list_transitionsdo

7: {Phương thức ReplaceCharInString dùng để thay thế một kí tự trong một

xâu bằng kí tự khác}

8: {Phương thức GetStopState dùng để kiểm tra xem một trạng thái có phải

là trạng thái kết thúc hay không?}

9: ifstart_state = state then

10: ifcount = 0then

11: tmp := tmp + (String.Uppercase start_state) + " = ({" + ReplaceCharIn- String transition_label ’=’ ’_’) + "} -> " + (GetStopState list_transitions stop_state)

12: else

13: tmp := tmp + "\n | {" + ReplaceCharInString transition_label ’=’ ’_’) + "} -> " + (GetStopState list_transitions stop_state)

14: end if 15: count++ 16: end if 17: end for 18: ifcount > 0then 19: i++ 20: ifi > 1then 21: fsp_str := fsp_str + ",\n" + tmp + ")" 22: else 23: fsp_str := fsp_str + tmp + ")" 24: end if 25: end if 26: end for 27: fsp_str fsp_str + ".\n"; 28: return fsp_str

Chương 4.Chuyển đổi giữa các dạng biểu diễn của LTS

Danh sáchlist_transitionsbao gồm các phần tử có định dạng là (start_state, transition_label, stop_state). Tại dòng 11 của Thuật toán 4.2 sẽ tìm ra các hàm chuyển có cùng trạng thái bắt đầu startstates. Nếu biến đếm count = 0 thì tạo mới một tiến trình con cho FSP. Ngược lại, tiến trình con sẽ được thêm vào FSP trước đó. Tại các dòng từ 20 đến 27, Thuật toán 4.2 xác định một tiến trình có phải là tiến trình bắt đầu của FSP hay không? Và FSP sẽ được thêm kí hiệu kết thúc vào cuối tại dòng 29.

Đầu vào:

Danh sách list_transitions: [(S0, "in", S1), (S1, "send", S2), (S2, "ack", S0)] Danh sách list_states: [S0, S1, S2]

Các bước thực hiện: 1: Bước 1:

2: Khởi tạo các biến: (adsbygoogle = window.adsbygoogle || []).push({});

3: fsp_str = null: là xâu rỗng

4: tmp = empty: là xâu rỗng

5: count = 0, i = 0: là các biến đếm 6: Bước 2:

7: Duyệt danh sách list_states 8: Gán count = 0, tmp = null 9: Phần tử S0:

10: Duyệt danh sách list_transitions 11: Phần tử (S0, in, S1): 12: count = 0 13: tmp = "S0 = (in -> S1" 14: count = 1 15: Phần tử (S1, send, S2): 16: S0 != S1 -> bỏ qua 17: Phần tử (S2, ack, S0): 18: S0 != S1 -> bỏ qua 19: (count = 1) > 0 -> i = 1

Chương 4.Chuyển đổi giữa các dạng biểu diễn của LTS

20: fsp_tmp = "S0 = ({in} -> S1)"

21: Tương tự đối với 2 phần tử S1 và S2, ta được:

22: fsp_tmp = "S0 = ({in} -> S1), S1 = ({send} -> S2),S2 = ({ack} -> S0)" 23: Bước 3:

24: Trả về chuỗi fsp_tmp biểu diễn một FSP

4.2.2 Phân tích đánh giá

Thuật toán 4.2 có tính dừng. Điều này có nghĩa là thuật toán kết thúc sau một khoảng hữu hạn thời gian thực thi. Tham số đầu vào của Thuật toán 4.2 là hai danh sách list_transitions và list_states. Trong Thuật toán 4.2, chương trình sẽ dừng khi duyệt hết toàn bộlist_transitionsvàlist_states. Các danh sách này đều là danh sách hữu hạn phần tử.

Luận văn đã trình bày phương pháp chuyển từ LF sang FSP. Tuy nhiên, kết quả thu được chưa được tối ưu hóa và phương pháp này chỉ mới được sinh ra FSP ở dưới dạng đơn giản nhất. Để giải quyết được bài toán này, cần phải dựa vào đặc tả và cú pháp của FSP. Sau đó cải tiến Thuật toán 4.2 để thu được xâu biểu diễn FSP được tối ưu hóa tốt hơn.

Chương 5

Thực nghiệm

5.1 Cài đặt chương trình

Chương trình được cài đặt dựa trên phần nhân của AGTool. Dựa vào đó, luận văn sẽ cài đặt các thành phần có chức năng chuyển đổi giữa các phương pháp biểu diễn của LTS. Trong quá trình nghiên cứu và phát triển chương trình, các thành phần này được kết hợp với công trình khóa luận tốt nghiệp của sinh viên

Vũ Hồng Long [9] để cài đặt một chương trình GUI-AGTool có giao diện người

dùng trên Ubuntu. Luận văn cũng đã tích hợp với LTSA thông qua một cầu nối để hỗ trợ chuyển đổi từ FSP sang LF. GUI-AGTool được cài đặt bằng ngôn ngữ

OCaml và các thành phần mới sử dụng công cụocamllex và ocamlyacc để đọc,

phân tích tập tin dữ liệu đầu vào. Ocamllex là bộ sinh dùng để sinh ra chương trình phân tích đoán nhận các mẫu từ vựng trong tập tin đầu vào. Các biểu thức chính quy và các luật được đặc tả trong tập tin từ vựng.Ocamllexsẽ sinh ra tập tin mã nguồn OCaml dựa vào tập tin đặc tả này. Tập tin mã nguồn được sinh ra sẽ định nghĩa các hàm xử lý từ vựng [15].Ocamlyacc là bộ sinh dùng để sinh ra

chương trình phân tích cú pháp của tập tin đầu vào [16]. Chương trình OCaml

sẽ có chức năng phân tích cú pháp cho tập tin dữ liệu đầu vào.

5.2 Giới thiệu về chương trình

Chương trình GUI-AGTool đã được cài đặt và cung cấp miễn phí tại địa chỉ 1.

Chương trình yêu cầu cài đặt các gói thư viện sau: • OCaml 3.12 được cung cấp tại địa chỉ2.

1http://uet.vnu.edu.vn/~hungpn/GUI-AGTool/

Chương 5.Thực nghiệm

• LablGTK dành cho môi trường OCaml được cung cấp tại địa chỉ3.

• Cairo-Ocaml được cung cấp tại địa chỉ4. (adsbygoogle = window.adsbygoogle || []).push({});

Chương trình có các chức năng hỗ trợ người dùng nhập/xuất dữ liệu và hiển thị dưới dạng biểu đồ trực quan. Hình 5.1 là giao diện chính của chương trình GUI-AGTool.

Hình 5.1: Giao diện chính của GUI-AGTool.

Các chức năng được cài đặt ở trong công cụ GUI-AGTool như sau:

• OpenFSPcó chức năng mở một tập tin đặc tả bằng ngôn ngữ FSP.OpenListing cho phép mở một tập tin đặc tả dưới dạng liệt kê. Sau khi mở tập tin thành công, GUI-AGTool tự động vẽ ra các thành phần được đặc tả trong tập tin dưới dạng biểu đồ trực quan.

• SaveWorking có chức năng lưu lại công việc đang thực hiện. Thông tin về các thành phần sẽ được đặc tả bằng ngôn ngữ FSP và được lưu lại vào tập tin để có thể sử dụng lâu dài.

3http://www.math.nagoya-u.ac.jp/~garrigue/soft/olabl/lablgtk.html

Chương 5.Thực nghiệm

• GenerateAssumption có chức sinh ra giả định của hệ thống đã được đặc tả. Phần xử lý bên dưới đã được cài đặt bởi [7]. Chức năng này sẽ hiển thị kết quả dưới dạng biểu đồ trực quan. Giả định sinh ra bởi GUI-AGTool được hiển thị bởi biểu đồ trực quan đặt trong thẻ Assumption. Hình 5.2 là một ví dụ cho giả định được sinh ra bởi GUI-AGTool.

Hình 5.2: Giao diện thể hiện giả định sinh ra bởi GUI-AGTool.

• Chức năng Save ở trong thẻ Assumption cho phép lưu giả định dưới dạng

tập tin được đặc tả bởi ngôn ngữ FSP.

5.3 Thực nghiệm

Luận văn đã tiến hành thực nghiệm với chín mẫu đầu vào đặc trưng. Kết quả thu được thõa mãn yêu cầu khi so sánh với công cụ LTSA. Các ví dụ đầu vào và kết quả có thể tải tại địa chỉ5. Thông tin của chín mẫu thử nghiệm được mô tả ở Bảng 5.1.M1,M2 là các thành phần của hệ thống.Plà thuộc tính của hệ thống.

Chương 5.Thực nghiệm

Luận văn trình bày một ví dụ minh họa về khả năng sử dụng ngôn ngữ FSP làm dữ liệu đầu vào của GUI-AGTool mà luận văn đã tiến hành thực nghiệm.

Ví dụ này có chứa các phép toánif .. then, whencủa FSP. Các thành phần đầu

vào được biểu diễn bằng FSP như trong Hình 5.3. Chương trình GUI-AGTool xử

lý dữ liệu FSP và biểu diễn các thành phần của M1, M2, P dưới dạng các biểu

đồ trực quan. Hình 5.4 tương ứng với thành phần M1. Hình 5.5 tương ứng với

thành phần M2. Hình 5.6 tương ứng với thành phần thuộc tính P. Luận văn đã

sử dụng công cụ LTSA để kiểm chứng lại kết quả của GUI-AGTool và thu được kết quả tương ứng. Kết quả giữa 2 công cụ GUI-AGTool và LTSA hoàn toàn khớp với nhau và đáp ứng được yêu cầu của luận văn. Hình 5.7 tương ứng với thành

phần M1 sinh ra bởi LTSA. Hình 5.8 tương ứng với thành phần M2 sinh ra bởi

LTSA. Hình 5.9 tương ứng với thành phần thuộc tínhPsinh ra bởi LTSA.

Bảng 5.1: Bảng kích cỡ số trạng thái các mẫu đầu vào

Tên tập tin đầu vào M1 M2 P

AP1_INPUT_P 1 3 3 AP2_INPUT_P 2 3 3 AP3_INPUT_P 3 3 3 AP4_INPUT_P 5 5 3 INPUT_OUTPUT_P 4 3 3 Mod_1_two_channel/A_INPUT_P 3 3 3 Mod_1_two_channel/Input_Output_p 6 5 4 Mod_2_two_channel/A_INPUT_P 5 5 4 complex_test 6 5 4

M1 = (a[i:1..3] ->ifi==1thenSTOPelseM1). M2 = M2[0],

M2[i:0..2] = (wheni<3 a -> M2[i+1]), M2[3] = STOP.

P = (a[i:0..3] -> (wheni==0 x -> STOP |wheni!=0 y -> P)). ||CS = (M1 || M2 || P).

Chương 5.Thực nghiệm (adsbygoogle = window.adsbygoogle || []).push({});

Hình 5.4: LTS của thành phầnM1.

Hình 5.5: LTS của thành phầnM2.

Chương 5.Thực nghiệm

Hình 5.7: LTS của thành phầnM1sinh ra bởi LTSA.

Hình 5.8: LTS của thành phầnM2sinh ra bởi LTSA.

Chương 5.Thực nghiệm

5.4 Đánh giá thực nghiệm

Luận văn đã sử dụng công cụ AGTool, LTSA để kiểm tra và so sánh kết quả của GUI-AGTool khi tiến hành thực nghiệm với các mẫu dữ liệu ở Bảng 5.1. Thực nghiệm đã thu được kết quả đúng như mong đợi. Xét về mặt ngữ nghĩa của LTS, các FSP được sinh ra đều khớp với dữ liệu dạng liệt kê tương ứng của nó. Giả định thu được ở dạng FSP tương ứng với kết quả thu được bởi công cụ AGTool. Kết quả này có ý nghĩa trong việc chứng minh rằng phương pháp mà luận văn đưa ra là đúng đắn. FSP được sinh ra bởi GUI-AGTool được sử dụng lại bởi LTSA có ý nghĩa quan trọng. Đặc tả của hệ thống và giả định sinh ra bởi GUI-AGTool có thể được kiểm chứng bởi công cụ LTSA thông qua việc sử dụng lại đặc tả của nhau.

Chương 6 Kết luận

Luận văn tập trung nghiên cứu công cụ AGTool hỗ trợ kiểm chứng dựa thành phần. Bằng phương pháp kiểm chứng dựa thành phần, thay vì kiểm chứng trên toàn bộ hệ thống thì các thành phần của hệ thống sẽ được kiểm chứng một các riêng biệt. Để thực hiện được phương pháp này, công cụ AGTool có nhiệm vụ hỗ trợ sinh ra giả định của hệ thống. Dựa trên những hiểu biết về công cụ này, luận văn nhận ra rằng AGTool còn có nhiều hạn chế cần được cải tiến. Nhằm

Một phần của tài liệu Nghiên cứu khả năng chuyển đổi giữa các đặc tả hình thức và ứng dụng trong kiểm chứng phần mềm (Trang 41)