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