Thuật toán tổng quát cho Wave có Rule

Một phần của tài liệu xây dựng bộ phân tích cú pháp chương trình (Trang 32 - 35)

Phần trên chúng ta lấy một ví dụ về Wave có Rule nhưng chưa tách biệt và chi tiết. Trong phần này chúng ta sẽ đi sâu hơn về các thuật toán của những Rule khác nhau.

Branching Rules

Nếu các Head của Wave có nhiều nhánh (branching rule):

1. Phân tích Head Wave thành nhiều nhánh con, sau đó gắn các biến Frontal và Tail vào các thành phần đó.

a. Kích hoạt các nhánh nhận được (tuần tự hoặc song song, phụ thuộc vào kiểu của Rule) bằng việc đưa chúng vào Wave Queue .

b. Đợi kết quả trả về từ các nhánh và đưa ra quyết định xử lý.

c. Kết hợp và xử lý các kết quả cuối cùng của các nhánh để đưa ra trạng thái kết quả của mỗi Rule, và tổng hợp các kết quả ở các nhánh khác nhau trên

SNR, để suy ra được kết quả SNR trên Rule đó. 2. Nếu kết quả trả về của Rule là TRUE:

a. Gửi Tail của chương trình tới tất cả các Node trên SNR (đã ghép thêm tất cả các biến Frontal của Node đó) bằng các nhánh của Wave, vì thế ta sẽ nhận được các Wave mới.

b. Kích hoạt các Wave mới độc lập này trong tất cả các Node SNR (bằng việc đưa chúng vào Wave Queue).

c. Kết quả cuối cùng được kích hoạt trong khi quyền điều khiển của nó được lan tỏa trên khắp các Tail của Wave. Quyền điều khiển này được gửi tới

SNR Node.

Trong trường hợp kết quả là DONE hoặc FALSE

Repetition:

Nếu Head của Wave được dùng bởi luật REPEAT: 1. Tạm dừng chuỗi Wave.

2. Tách biến Frontal từ Wave.

3. Với luật khác nhau ta tách được các chuỗi Wave từ Head của Wave ban đầu. 4. Ghép các biến Frontal được lấy ra từ Wave, từ đó nhận được Wave mới 5. Kích hoạt Wave mới và cho vào hàng đợi trong máy tính hiện tại và đợi kết

quả cuối cùng trả về (nơi mà Wave có thể lan rộng ra các máy khác). 6. Nếu kết quả cuối cùng trả về có trạng thái là TRUE:

a. Sao chép và gửi tất cả các chuỗi Wave (mà bị trì hoãn ở bước 1) tới tất cả các Node SNR (có thể trong cùng máy hoặc khác máy).

b. Ghép chuỗi Wave này trong SRN Node với các biến Frontal được lấy ra từ Node tương ứng.

c. Kích hoặc các Wave mới nhận được trong mỗi SNR Node bằng việc đưa chúng vào hàng đợi của máy tính đang chứa Node này.

d. Đưa quyền điều khiển vào các Wave đã được kích hoạt và kết quả cuối cùng của Rule trả về từ Node hiện tại.

Trong trường hợp khác

e. Tách các Tail của Wave và ghép các biến Frontal được lấy từ Node hiện tại với chúng

f. Kích hoạt Wave mới trong Node hiện tại bằng cách đưa chúng vào trong hàng đợi

Wait

Nếu Head của Wave được dùng bởi luật WAIT:

1. Tách các biến Frontal từ Wave.

2. Lây chuỗi Wave từ Head và tạm dừng Tail.

3. Ghép các biến Frontal vào Wave (Wave này lấy từ Head) ta nhận được Wave mới).

4. Kích hoạt Wave mới bằng cách cho chúng vào hàng đợi trong máy tính hiện tại và đợi kết quả trả về. (adsbygoogle = window.adsbygoogle || []).push({});

5. Nếu một số nhánh của Wave trả về với trạng thái kết quả là ABORT: a. Kích hoạt ngay kết quả trả về từ các thành Tail của Rule-controlled. b. Cài đặt trạng thái trả về trên Rule là FALSE.

d. Thay thế và gửi Tail của Wave tới tất cả các Node SNR được nhận từ Head.

e. Ghép Tail của Wave trong SNR Node với biến Frontal được lấy từ Node này.

f. Kích hoạt Wave mới nhận được trong mỗi SNR Node bằng cách cho chúng vào hàng đợi của máy tính mà chứa SNR Node đó.

g. Đưa quyền điều khiển vào các Wave đã được kích hoạt và kết quả cuối cùng của Rule trong Node hiện tại.

Trong trường hợp trạng thái trả về DONE hoặc FALSE

h. Trạng thái trả về của Rule là DONE hoặc FALSE nếu Tail của Wave bị mất.

Indivisible

Nếu Head của Wave được sử dụng bởi luật INDIVISIBLE: 1. Tách biến Frontal từ Wave

2. Lấy Wave từ Head và tạm dừng Tail của Wave. 3. Khóa Node hiện tại từ 1 Node khác.

4. Gắn biến Frontal, và đợi kết quả trả về.

5. Mở khóa cho Node hiện tại để sử dụng bới Wave khác.

6. Gửi Wave tới SNR Node, và gắn biến Frontal bởi Head của Wave.

7. Kích hoạt các Wave nhận được trong tất cả SNR Node bằng cách cho chúng vào hàng đợi.

8. Đưa quyền điều khiển tới Wave trong SNR.

Create

Nếu Head của Wave được sử dụng bởi luật CREATE:

1. Tách biền Frontal từ Wave

2. Lấy Wave từ Head và cho tạm dừng phần Tail của Wave.

3. Cung cấp trạng thái lan tỏa “Create”.

4. Kích hoạt Head của Wave bằng cách cho vào trong hàng đợi ở máy tính hiện tại. Ở đây Head có thể tạo ra Node mới, Link mới và đợi kết quả trả về.

5. Phân chia Tail của Wave thành các trạng thái như: create, navigation…

6. Gửi Tail của Wave tới tất cả các SNR Node. Sau đó gắn thêm các biến Frontal (được lấy từ các Node này). Kích hoạt Wave mới bằng cách cho vào hàng đợi.

Một phần của tài liệu xây dựng bộ phân tích cú pháp chương trình (Trang 32 - 35)