Mơi trường định nghĩa là khối bên trên của Hình5.1, nơi tạo ra các biểu đồ của UML (bao gồm biểu đồ lớp và biểu đồ tuần tự) biểu diễn các mơ hình khởi đầu và mơ hình tiến hóa của hệ thống. Môi trường định nghĩa
cũng chịu trách nhiệm nhận vào các tệp OCL đặc tả các hành vi cần kiểm chứng, đồng thời thực hiện công việc kiểm tra sự tương thích về kiểu giữa các biểu thức OCL so với các đặc tả của mơ hình. Tất cả các tệp dữ liệu đầu vào (mơ hình và hành vi) cần được chuyển đối sang định dạng XML trước khi nhập liệu vào công cụ CVT.
Môi trường thực thi là khối bên dưới của Hình 5.1, khối này bao gồm hai phần chính là OCL2FOL Translator và Checking Consistency. Phần OCL2FOL Translator ở phía bên trái thực thi nhiệm vụ chuyển đổi biểu thức OCL sang các cơng thức FOL. Cịn ở phía bên phải, chức năngChecking Consistency chỉ đơn giản là nhận vào công thức FOL (là sản phẩm đầu ra của chức năng OCL2FOL Translator) và so sánh sự tương đương giữa hai công thức này. Chú ý rằng, hai công thức FOL này vẫn tương ứng với các biểu thức OCL của hai mơ hình trước và sau khi tái cấu trúc. Để thực thi chức năng Checking Consistency, luận án sử dụng lại một công cụ khá phổ
biến được cung cấp bởi Microsoft là Z3 [22]. Kết quả cuối cùng về tính nhất quán giữa các hệ thống phần mềm cũng được thông báo bởi chức năng này. Nếu hai công thức FOL là tương đương nhau, điều này đồng nghĩa với việc hai mơ hình trước và sau khi tái cấu trúc là nhất quán toàn phần với nhau,
trong các trường hợp cịn lại, hai mơ hình có thể nhất quán một phần, hoặc không nhất quán với nhau.
Luận án tập trung giải quyết vấn đề quan trọng nhất và mang yếu tố quyết định trong việc xây dựng cơng cụ CVT, đó là tiến trình chuyển đổi từ biểu thức OCL sang công thức FOL. Một số nghiên cứu đã thực hiện chuyển đổi OCL sang FOL [7, 20], tuy nhiên, nghiên cứu của họ chưa xem xét đến một số tốn hạng (ví dụ câu lệnh if-then-else). Để thực hiện công việc chuyển đổi, chúng tôi sử dụng cây cú pháp trừu tượng (Abtract Syntax Tree - AST) như một phương tiện trung gian hỗ trợ cho tiến trình này.
5.2.2 Chuyển đổi biểu thức OCL sang công thức FOL
Beckert và các cộng sự đã thực hiện nghiên cứu bài toán chuyển đổi từ OCL sang FOL một cách khá chi tiết [7]. Sự tương ứng giữa biểu thức OCL ban đầu và cơng thức FOL của nó được tóm tắt lại như trong Bảng 5.1. Dựa trên cơ sở này, chúng tôi tiếp tục chuyển đổi các công thức mang tính phức tạp hơn.
Ý tưởng chính của qúa trình chuyển đổi là xây dựng một văn phạm phi ngữ cảnh sản xuất các biểu thức chính quy OCL. Sau đó, bằng cách sử dụng bộ phân tích cú pháp các biểu thức OCL này sẽ được mơ tả bằng cây phân tích cú pháp. Kế tiếp, chúng tơi đề xuất thuật toán chuyển đổi từ cây phân tích cú pháp sang cây cú pháp trừu tượng (AST). Cây này, sẽ bao gồm nút gốc, nút nhánh và nút lá. Trong đó, các nút lá sẽ là các biểu thức OCL đã được chuyển đổi trong Bảng 5.1 [7], các nút nhánh sẽ là các biểu thức mới được định nghĩa như trong Bảng 5.2. Cuối cùng, kết hợp các công thức thành phần của cây AST chúng ta sẽ có cơng thức FOL tương ứng với biểu thức OCL ban đầu. Sau đây là chi tiết các bước chuyển đổi này.
Giả sử G là văn phạm sản sinh một ngôn ngữ cho trước, C biểu diễn OCL cần chuyển đổi, P là cây phân tích cú pháp của văn phạm G, AST
và F lần lượt là cây AST và công thức logic vị từ cấp 1 tương ứng với biêu thức C.
Các bước chuyển đổi từ OCL sang FOL được thực hiện tuần tự như sau: 1. Định nghĩa văn phạm phi chính quy G sản xuất các biểu thức OCL
Bảng 5.1: Biểu thức OCL và công thức FOL tương ứng
OCL FOL OCL FOL not ! x.intersection(y) x ∩y
and & x.union(y) x ∪y
or | x.includes(y) y ∈x
implies → x.excludes(y) y 6∈x
x.including(y) x ∪ {y} x.excludesAll(y) y ⊆x
x.excluding(y) x \ {y} x.isEmpty() x =∅
x.includesAll(y) x ∩y =∅ x.notEmpty() x 6=∅
x.equals(y) x =y x <>y x 6=y
2. Định nghĩa tập luật chuyển đổi (Bảng 5.2) kết hợp với các luật sản xuất của G;
3. Sử dụng thuật toán LL(1) [32] để sản sinh cây phân tích cú phápP từ
C ∈L(G) và G;
4. Dựa trên tập luật của G và P đã có, đề xuất Thuật tốn 5.1 để xây dựng cây AST;
5. Sử dụng thuật tốn tìm kiếm theo chiều sâu (DFS) cho cây AST và ánh xạ mỗi nút của câyAST sang các công thức f1,f2, ...,fn trong FOL (theo Bảng 5.1);
6. Cuối cùng, kết hợp các công thức thành phần f1,f2, ...,fn sẽ thu được công thức F tương ứng với biểu thức C ban đầu.
Sau đây, luận án sẽ đi vào trình bày chi tiết từng bước trong quy trình chuyển đổi này.
Định nghĩa 5.1 (Văn phạm vi ngữ cảnh sản sinh biểu thức OCL). Một văn phạm phi ngữ cảnh sản sinh biểu thức OCL (OCFG) G là một bộ-4
(N,T,R,S) trong đó:
N ={Constraint, Name, Pre, Post, Op, ExprList}là tập hữu hạn các ký hiệu chưa kết thúc;
T ={context, inv, if, then, else, endif, +, -, *,
/, and, or, not, implies, identify,v.v.} là tập hữu hạn các ký hiệu đầu cuối và N ∩T =∅;
S = {Constraint} ∈N là ký tự bắt đầu.
Bảng 5.2: Các luật sản xuấtR của văn phạm phi ngữ cảnh G
<Constraint> :: context <Name> inv <ExprList> | <Pre Post> <Constraint>
| <ExprList> <Constraint> | ε
<Pre Post> :: <Name> <ExprList>
<ExprList> :: if <ExprList> then <ExprList> endif | else <ExprList> | (<ExprList>) | <ExprList> Op <ExprList> | identify Op :: +|-|*|/|not|and|or|implies, etc. <Name> :: identify
Định nghĩa 5.2 (Các luật chuyển đổi TR). Với mỗi luật sản xuất A ⇒ α
có thể được kết hợp với các luật biến đổi b =f(c1,c2, ...,ck), trong đó:
– f là một hàm;
– b là một thuộc tính tổng hợp, c1,c2, ...,ck là các thuộc tính ở phía bên phải của luật sản xuất A⇒α, trong trường hợp còn lại
– b là một thuộc tính được kế thừa, c1,c2, ...,ck là các thuộc tính của các ký tự khác.
Bảng 5.3 là tập các luật biến đổi cho cú pháp của biểu thức OCL đã được xác định trong Định nghĩa 5.1. Trong đó:
– newAstNode() là một hàm; – tran là một thuộc tính tổng hợp;
– inv, if, then, endif là các thuộc tính được kế thừa;
Gọi VP,EP tương ứng là tập các nút, các cạnh của cây phân tích cú pháp P. TR là tập các luật chuyển đổi được xác định trong Định nghĩa 5.2.
Bảng 5.3: Tập các luật xây dựng cây AST từ văn phạm phi ngữ cảnh G
Production Rules Translation Rules
<Constraint> Rule 1 :: context <Name> inv <ExprList> Constraint.tran=newAstNode(identify) Constraint.tran=newInvNode(inv) Constraint.tran=ExprList.tran
Rule 2 | <Pre Post>
<Constraint> Constraint.tran=Pre Post.tran Constraint.tran=Constraint.tran Rule 3 | <ExprList> <Constraint> Constraint.tran=ExprList.tran Constraint.tran=Constraint.tran | ε Constraint.tran=NULL <Pre Post> Rule 4 :: <Name> <ExprList> Pre Post.tran=Name.tran Pre Post.tran=newEqualNode(Equal) Pre Post.tran=ExprList.tran <ExprList> Rule 5 :: if <ExprList> then <ExprList> endif ExprList.tran=newIfNode(if) ExprList.tran=newThenNode(then) ExprList.tran=newEndNode(endif) ExprList.tran=ExprList.tran Rule 6 | else
<ExprList> ExprList.tran= ExprList.tran
Rule 7 | (<ExprList>) ExprList.tran=ExprList.tran
Rule 8 | <ExprList> Op
<ExprList>
Expr-
List.tran=newOpNode(ExprList.tran, ExprList.tran)
Rule 9 | identify newAstNode(identify)
Op Rule 10, 11, 12 etc. :: +|- |not|and|implies... newAddNode(Op.tran,Op.tran) newSubNode(Op.tran,Op.tran) newTimeNode(Op.tran,Op.tran) newAndNode(Op.tran,Op.tran) etc. <Name>
Rule 15 :: identify newAstNode(identify)
dựng cây AST từ cây phân tích cú pháp P được mơ tả như trong Thuật toán 5.1.
Trong thuật toán này, chúng tơi sử dụng thuật tốn tìm kiếm theo chiều sâu (BFS) trong lý thuyết đồ thị, nó được sử dụng để duyệt hoặc tìm kiếm dữ liệu trên các cấu trúc dữ liệu đồ thị [18]. Edge(ci,b) là hàm trả về giá
trị là cạnh nối giữa hai nút ci và b.
Thuật toán 5.1 Xây dựng câyAST từ cây phân tích cú pháp P Input: {VP,EP,TR} Output: {VA,EA} Initialisation : 1: VA=∅ 2: EA=∅
3: OP = {+| − | ∗ |/|not |and |or |implies, ...}
Process:
4: foreach n ← BreadthFirstSearch(P) do
5: if Child (n == 0kn ∈OP)then
6: VA=VA∪{n}
7: end if
8: end for
9: foreach n ← BreadthFirstSearch(P) do
10: for all b =f(c1,c2, ...,ck) do 11: fori = 1tok do 12: EA=EA∪Edge(ci,b) 13: end for 14: end for 15: end for 16: return
tự các bước chuyển đổi từ OCL sang FOL. Chúng ta nhận được một cây
AST tương ứng với biểu thức OCL ban đầu. Bằng cách sử dụng lại kết quả của nghiên cứu [15], để chuyển đổi các biểu thức OCL rời rạc sang công thức FOL (Bảng 5.1), chúng ta sẽ có một tập hợp các cơng thức FOL là
f1,f2, ...,fn.
Bước cuối cùng trong danh sách trên là tiến hành kết hợp một cách tuần tự các công thức f1,f2, ...,fn đã thu được, chúng ta sẽ có cơng thức F trong FOL tương ứng với biểu thức OCL ban đầu.
Như vậy, trong phần này chúng tơi đã trình bày tồn bộ cơ sở lý thuyết của việc chuyển đổi một biểu thức OCL tổng hợp sang công thức FOL, cũng như lý do của việc chuyển đổi này. Trong tiểu mục tiếp theo, để hiện thực hóa cơ sở lý thuyết đã đề xuất, luận án tiến hành cài đặt thử nghiệm cho công cụ này.