Nhập môn Chương trình dịch - Bài 12 - Pdf 19

Nhập môn Chương trình dịch
Học kì II 2006 – 2007
Bài 12: Luật ngữ nghĩa (tiếp)
Luật ngữ nghĩa: dãy lệnh (block)
• Luật: một dãy lệnh có kiểu đúng nếu lệnh
đầu tiên có kiểu đúng và dãy lệnh sau đó
cũng có kiểu đúng.
• Làm thế nào nếu S
1
là lệnh khai báo?
A ├ S
1
: T
1
A ├ (S
2
, S
3
, … S
n
) : T
n
A ├ (S
1
, S
2
, … S
n
) : T
n
(block)

Decl d = (Decl)stmts[i];
s = s.add(d.id, d.type.interpret());
}
}
return t;
}
}
A ├ T id : T
1
(lệnh khai báo)
A, id : T ├ (S
2
, S
3
, … S
n
) : T
n
A ├ (T id, S
2
, … S
n
) : T
n
(decl. block)
Luật ngữ nghĩa: lời gọi hàm
• Nếu E là một hàm có kiểu
E : T
1
x T

(i = 1, 2, … n)
A ├ E(E
1
, E
2
, … E
n
) : T
r
(func. call)
Luật ngữ nghĩa: định nghĩa hàm
• C/C++: hàm được viết dưới dạng
T
r
f(T1 a
1
, … T
n
a
n
)
{ …
return E;
}
• Kiểu của E phải là T
r
, nhưng trong ngữ
cảnh (bảng kí hiệu) nào?
Luật ngữ nghĩa: định nghĩa hàm
• Giả sử A là ngữ cảnh bao quanh định

├ x - 1 : int
A
2
├ fact : int  int
A
2
├ fact(x-1) : int
A
2
├ x : int
A
2
├ x*fact(x-1) : int
A
2
├ x : int A
2
├ 0 : int
A
2
├ x == 0 : bool
A
2
├ 1 : int
Luật ngữ nghĩa: lệnh return
• Kiểm tra kiểu của lệnh return: E phải có
kiểu là kiểu trả về của hàm (tức là T = T
r
)
• Lệnh return có kiểu unit (có kiểu đúng)

A
2
├ return E : unit
Xây dựng bộ luật ngữ nghĩa
• Các luật ngữ nghĩa khác đều viết tương tự như
các luật đã học
• Bộ luật ngữ nghĩa cho phép đánh giá một
chương trình có kiểu đúng hay không
• Cách viết: theo kiểu quy nạp
– Viết các luật tiên đề
– Với mỗi nút (sản xuất) trong cây cú pháp viết luật ngữ
nghĩa cho nút đó từ các luật nhỏ hơn
• Như vậy, bộ luật ngữ nghĩa cho phép kiểm tra
kiểu của một chương trình viết đúng cú pháp và
việc kiểm tra luôn luôn dừng


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status