THỊ PHỤ THUỘC

Một phần của tài liệu ngôn ngữ lập trình và chương trình dịch (Trang 74 - 76)

- Stack lưu một chuỗi s0X1s1X 2s2 X msm trong đó sm nằm trên đỉnh Stack

3THỊ PHỤ THUỘC

Nếu một thuộc tính b tại một nút trong cây phân tích cú pháp phụ thuộc vào một thuộc tính c, thế thì hành động ngữ nghĩa cho b tại nút đó phải được thực hiện

D

T L1

int L2 , a

L3 , b

sau khi thực hiện hành động ngữ nghĩa cho c. Sự phụ thuộc qua lại của các thuộc tính tổng hợp và kế thừa tại các nút trong một cây phân tích cú pháp có thể được mô tả bằng một đồ thị có hướng gọi là đồ thị phụ thuộc (dependency graph).

- Đồ thị phụ thuộc là một đồ thị có hướng mô tả sự phụ thuộc giữa các thuộc tính tại mỗi nút của cây phân tích cú pháp.

Trước khi xây dựng một đồ thị phụ thuộc cho một cây phân tích cú pháp, chúng ta chuyển mỗi hành động ngữ nghĩa thành dạng b := f(c1,c2,. . .,ck) bằng cách dùng một thuộc tính tổng hợp giả b cho mỗi hành động ngữ nghĩa có chứa một lời gọi thủ tục. Đồ thị này có một nút cho mỗi thuộc tính, một cạnh đi vào một nút cho b từ một nút cho c nếu thuộc tính b phụ thuộc vào thuộc tính c. Chúng ta có thuật toán xây dựng đồ thị phụ thuộc cho một văn phạm cú pháp điều khiển như sau:

for mỗi nút n trong cây phân tích cú pháp do

for mỗi thuộc tính a của ký hiệu văn phạm tại n do

xây dựng một nút trong đồ thị phụ thuộc cho a;

for mỗi nút n trong cây phân tích cú pháp do

for mỗi hành động ngữ nghĩa b:=f(c1,c2, . . .,ck) đi kèm với sản xuất được dùng tại n do

for i:=1 to k do

xây dựng một cạnh từ nút ci đến nút b

VD 1: Dựa vào cây phân tích ( nét đứt đoạn) và luật ngữ nghĩa ứng với sản xuất ở bảng, ta thêm các nút và cạnh thành đồ thị phụ thuộc:

Ví dụ 2:

Với ví dụ 2, ta có một đồ thị phụ thuộc như sau: chú ý:

+ chuyển hành động ngữ nghĩa addentry(id.entry,L.in) của sản xuất L->L , id thành thuộc tính giả f phụ thuộc vào entryin

sản xuất luật ngữ nghĩa

Sản xuất Luật ngữ nghĩa

E E1 | E2 E.val = E1.val + E2.val

E

E1 + E2

D -> T L L.in := T.type

T -> int T.type := interger

T -> float T.type := float

L -> L1, id L1.in := L.in ; addtype(id.entry, L.in)

L -> id addtype(id.entry,L.in)

Đối với một đồ thị tổng quát, chúng ta phải để ý đến các đặc điểm sau: (adsbygoogle = window.adsbygoogle || []).push({});

+ Xây dựng đồ thị phụ thuộc cho các thuộc tính của ký hiệu văn phạm phải được xây dựng trên cây cú pháp.

+ Trong đồ thị phụ thuộc, mỗi nút đại diện cho một thuộc tính của một ký hiệu văn phạm.

+ Có thể một loại thuộc tính này lại phụ thuộc vào một loại thuộc tính khác, chứ không nhất thiết là chỉ các thuộc tính cùng loại mới phụ thuộc vào nhau. Trong ví dụ trên, thuộc tính entry phụ thuộc vào thuộc tính in.

+ Có thể có “vòng” trong đồ thị phụ thuộc, khi đó chúng ta sẽ không tính được giá trị ngữ nghĩa cho các nút vì gặp một hiện tượng khi tính a cần tính b, mà khi tính b lại cần tính a.

Chính vì vậy, trong thực tế chúng ta chỉ xét đến văn phạm cú pháp ngữ nghĩa mà đồ thị phụ thuộc của nó là một DAG không có vòng.

Một phần của tài liệu ngôn ngữ lập trình và chương trình dịch (Trang 74 - 76)