ĐỊNH NGHĨA CÚ PHÁP ĐIỀU KHIỂN.

Một phần của tài liệu GIÁO TRÌNH MÔN CHƯƠNG TRÌNH DỊCH (Trang 77 - 80)

- Quỏ trỡnh tớnh ∆i j VD: tớnh ∆ 2 4, Tớnh:

2. ĐỊNH NGHĨA CÚ PHÁP ĐIỀU KHIỂN.

Cỳ phỏp điều khiển (syntax-directed definition) là một dạng tổng quỏt hoỏ của văn phạm phi ngữ cảnh, trong đú mỗi ký hiệu văn phạm cú một tập thuộc tớnh đi kốm, được chia thành 2 tập con là thuộc tớnh tổng hợp (synthesized attribute) và thuộc tớnh kế thừa (inherited attribute) của ký hiệu văn phạm đú.

Một cõy phõn tớch cỳ phỏp cú trỡnh bày cỏc giỏ trị của cỏc thuộc tớnh tại mỗi nỳt được gọi là cõy phõn tớch cỳ phỏp cú chỳ giải (hay gọi là cõy phõn tớch đỏnh dấu) (annotated parse tree).

2.1. Cỳ phỏp điều khiển.

2.1.1. Dạng của định nghĩa cỳ phỏp điều khiển.

Trong mỗi cỳ phỏp điều khiển, mỗi sản xuất A->α cú thể được liờn kết với một tập cỏc qui tắc ngữ nghĩa cú dạng b = f(c1, . . .,ck) với f là một hàm và

a) b là một thuộc tớnh tổng hợp của A, cũn c1, . . .,ck là cỏc thuộc tớnh của cỏc ký hiệu trong sản xuất đú. Hoặc

b) b là một thuộc tớnh kế thừa của một trong những ký hiệu ở vế phải của sản xuất, cũn c1, . . . ,ck là thuộc tớnh của cỏc ký hiệu văn phạm.

Ta núi là thuộc tớnh b phụ thuộc vào cỏc thuộc tớnh c1, . . .,ck.

- Một văn phạm thuộc tớnh (Attribute Grammar) là một cỳ phỏp điều khiển mà cỏc luật ngữ nghĩa khụng cú hành động phụ.

Vớ dụ: Sau đõy là văn phạm cho một chương trỡnh mỏy tớnh bỏ tỳi với val là một thuộc tớnh biểu diễn giỏ trị của ký hiệu văn phạm.

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

L -> E n Print(E.val)

E -> E1 + T E.val = E1.val + T.val

E -> T E.val = T.val

T -> T1 * F T.val = T1.val * F.val

T -> F T.val = F.val

F -> ( E ) F.val = E.val

F -> digit F.val = digit.lexval

Từ tố digit cú thuộc tớnh Lexval: là giỏ trị của digit đú được tớnh nhờ bộ phõn tớch từ vựng. Kớ hiệu n : xuống dũng, Print : in kết quả ra màn hỡnh.

2.1.2. Thuộc tớnh tổng hợp.

Trờn một cõy phõn tớch, thuộc tớnh tổng hợp được tớnh dựa vào cỏc thuộc ở cỏc nỳt con của nỳt đú, hay núi cỏch khỏc thuộc tớnh tổng hợp được tớnh cho cỏc ký hiệu ở vế trỏi của sản xuất và tớnh dựa vào thuộc tớnh của cỏc ký hiệu ở vế phải.

Một cỳ phỏp điều khiển chỉ sử dụng cỏc thuộc tớnh tổng hợp được gọi là cỳ phỏp điều khiển thuần tớnh S (S-attribute definition).

Một cõy phõn tớch cho văn phạm cỳ phỏp điều khiển thuần tớnh S cú thể thực hiện cỏc luật ngữ nghĩa theo hướng từ lỏ đến gốc và cú thể sử dụng trong phương phỏp phõn tớch LR.

Vớ dụ: vẽ cõy cho đầu vào: 3*4+4n

vớ dụ 1

Chỳng ta duyệt và thực hiện cỏc hành

động ngữ nghĩa của vớ dụ trờn theo đệ qui

trờn xuống: khi gặp một nỳt ta sẽ thực

hiện tớnh thuộc tớnh tổng hợp của cỏc con của

nú rồi thực hiện hành động ngữ nghĩa

trờn nỳt đú. Núi cỏch khỏc, khi phõn tớch cỳ phỏp theo kiểu bottom-up, thỡ khi nào gặp

LE E 1 E 2 T 3 T1 T2 * F2 F1 3 + F3 n 4 4

hành động thu gọn, chỳng ta sẽ thực hiện hành động ngữ nghĩa để đỏnh giỏ thuộc tớnh tổng hợp.

F1.val=3 (syntax: F1->3 semantic: F1.val=3.lexical) F2.val=4 (syntax: F2->3 semantic: F2.val=4.lexical) T2.val=3 (syntax: T2->F1 semantic: T2.val=F1.val )

T1.val=3*4=12 (syntax: T1->T2*F2 semantic: T1.val=T2.val*F2.val) F3.val=4 (syntax: F3->4 semantic: F3.val=4.lexical)

T3.val=4 (syntax: T3->F3 semantic: T3.val=F3.val )

E1.val=12+4=16 (syntax: E1->E2+T3 semantic: E1.val=E2.val+T3.val) “16” (syntax: L->E1 n semantic: print(E1.val))

2.1.3. Thuộc tớnh kế thừa.

Thuộc tớnh kế thừa (inherited attribute) là thuộc tớnh tại một nỳt cú giỏ trị được xỏc định theo giỏ trị thuộc tớnh của cha hoặc anh em của nú.

Thuộc tớnh kế thừa rất cú ớch trong diễn tả sự phụ thuộc ngữ cảnh. Vớ dụ chỳng ta cú thể xem một định danh xuất hiện bờn trỏi hay bờn phải của toỏn tử gỏn để quyết định dựng địa chỉ hay giỏ trị của định danh.

Vớ dụ về khai bỏo:

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

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

T -> int T.type := interger

T -> real T.type := real

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

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

Vớ dụ: int a,b,c Ta cú cõy cỳ phỏp:

Chỳng ta duyệt và thực hiện cỏc hành động ngữ nghĩa sẽ được kết quả như sau:

T.type = interger (syntax:T->int semantic: T.type=interger) L1.in = interger (syntax: D -> T L1 semantic: L1.in=T.type)

DT L1 T L1 int L2 , a L 3 , b c

L2.in = interger (syntax: L1 -> L2 , a semantic: L2.in = L1.in )

a.entry = interger (syntax: L1 -> L2 , a semantic: addtype(a.entry,L1.in) ) L3.in = interger (syntax: L2 -> L3 , b semantic: L3.in = L2.in )

b.entry = interger (syntax: L2 -> L3 , b semantic: addtype(b.entry,L2.in) ) c.entry = interger (syntax: L3 -> c semantic: addtype(c.entry,L3.in) )

Một phần của tài liệu GIÁO TRÌNH MÔN CHƯƠNG TRÌNH DỊCH (Trang 77 - 80)

Tải bản đầy đủ (DOC)

(158 trang)
w