Đặc tả hình thức Ngôn ngữ lập trình là một hệ thống gồm các kí hiệu và các qui tắc kết hợp các kí hiệu thành các cấu trúc có ý nghĩa.. Cú pháp và ngữ nghĩa của một ngôn ngữ lập trình
Trang 1Chương 2 ĐẶC TẢ HÌNH THỨC NGÔN NGỮ LẬP TRÌNH
Trang 3Đặc tả hình thức
Ngôn ngữ lập trình là một hệ thống gồm các kí hiệu và các qui tắc kết hợp các kí hiệu thành các cấu trúc có ý nghĩa Phần cú pháp qui định sự kết hợp của các kí hiệu, còn phần ngữ nghĩa qui định ý nghĩa của mỗi sự kết hợp đó.
Cú pháp và ngữ nghĩa của một ngôn ngữ lập trình được xác định một cách hình thức bằng cách sử dụng một hệ thống kí hiệu khác, thực chất cũng là một ngôn ngữ (siêu ngôn ngữ)
Siêu ngôn ngữ (meta language): là ngôn ngữ được sử dụng
để xác định cú pháp hoặc ngữ nghĩa của một ngôn ngữ lập trình.
Đặc tả hình thức của mỗi ngôn ngữ lập trình (Formal
Trang 4Đặc tả hình thức
Bộ từ vựng
Cú pháp (Văn phạm)
Ngữ nghĩa
Trang 5 Pattern : Pattern của một token là các qui tắc kết hợp các kí tự
để tạo nên token đó
Lexeme : Là một chuỗi các kí tự thoả mãn pattern của một
token
Trang 6Token, Lexeme, pattern
Token Lexeme Thông tin mô tả của pattern
< hoặc <= hoặc > hoặc >= hoặc = hoặc <>
Một kí tự, tiếp theo là các kí tự hoặc chữ số
Bất kì hằng số nào Các kí tự nằm giữa " và " ngoại trừ \"
Trang 7Biểu thức chính quy (regular expression)
Để biểu diễn các token người ta dùng biểu thức chính quy
Một biểu thức chính quy là một chuỗi miêu tả một bộ các chuỗi khác, theo những quy tắc cú pháp nhất định
BTCQ có thể hiểu như là một ngôn ngữ nhỏ dùng cho mục đích: để tìm một chuỗi con trong biểu thức chuỗi
lớn
VD: email
/^(?:\w+\.?)*\w+@(?:\w+\.)+\w+$/
Trang 8Dùng biểu thức chính quy để biểu diễn các tokens
a : có xuất hiện ký tự 'a'
ab : có xuất hiện ký tự 'b' theo sau ký tự 'a' (theo đúng thứ tự)
a|b : có 'a' hoặc có 'b'
a* : xuất hiện nhiều hoặc không xuất hiện ký tự 'a'
a+ : xuất hiện nhiều hoặc ít nhất là một ký tự 'a'
(a)+ == a(a)*
a3 : xuất hiện 3 ký tự a
a? : xuất hiện a hoặc không xuất hiện (a)? = a | ∈
VD: biểu diễn số nguyên:
digits = '0' | '1' | '2' | '3' | '4 | '5' | '6' | '7' | '8' | '9'
Trang 9dn rn
Trong đó di là các tên, ri là các BTCQ trên tập các kí hiệu
{dd1, d2, di-1}
Trang 10Ví dụ
ĐNCQ của các định danh trong pascal là
letter A | B | | Z | a | b | | zdigit 0 | 1 | | 9
id letter (letter | digit)*
Trang 12Bài tập
Viết chương trình kiểm tra form đăng nhập theo yêu cầu bên dưới sử dụng biểu thức chính qui, bằng một trong các ngôn ngữ sau: Java, Javascript, php, ASP Net, C#
– Tên đăng nhập dài từ 6 đến 30 kí tự, gồm các kí tự từ a-z, 0-9 và khoảng trắng, không chứa các kí hiệu đặc biệt khác
– Mật khẩu từ 4-12 kí tự, có chứa ký tự đặc biệt.
– Ngày sinh,
số điện thoại,
email theo đúng
định dạng như bên
Trang 132.2 Cú pháp hình thức
Cú pháp là thành phần quan trọng nhất trong một ngôn ngữ
Cú pháp được biểu diễn bởi một bộ luật cú pháp Bộ luật này dùng để mô tả cấu trúc của chương trình, câu lệnh.
Bộ luật cú pháp của các ngôn ngữ khác nhau thì khác nhau.
Để lập trình đúng, người lập trình phải nắm được bộ luật cú pháp của ngôn ngữ mà mình dùng xây dựng ứng dụng
Trang 14Các dạng cú pháp hình thức
Cú pháp trừu tượng (abstract syntax)
Cú pháp cụ thể (concrete syntax)
Trang 15a) Cú pháp trừu tượng
Phân các yếu tố ngôn ngữ thành các lớp cú pháp (syntactic
class)
Liệt kê tất cả các dạng (syntactic form) của mỗi lớp
– Không đề cập đến kí hiệu của ngôn ngữ mà nó mô tả.
– Có thể xẩy ra hiện tượng nhập nhằng (ambiguity)
VD Biểu thức ‘a-b-c’ có thể hiểu là (a-b) – c hoặc a- (b-c)
E O E E O E
Trang 17b) Cú pháp cụ thể
phi ngữ cảnh: Context – Free Grammar)
– Ký hiệu bắt đầu S N(Start symbol)
– Tập các ký hiệu không kết thúc N (Non-terminals)
– Tập các ký hiệu kết thúc (Terminals)
– Tập các luật sinh P (Production) có dạng: A
Với A N và là chuỗi các ký hiệu kết thúc và không kết thúc
Câu hợp lệ của ngôn ngữ là chuỗi kí hiệu kết thúc được
dẫn ra từ kí hiệu khởi đầu S thông qua các luật sinh trong
Trang 18<term> ::= <factor> | <term> <multop><factor>
<factor> ::= <identifier> | <literal> | (<expression>)
<identifier> ::= a | b | c,….|z
Trang 19Cú pháp phi ngữ cảnh
Cú pháp cụ thể còn được gọi là cú pháp phi ngữ cảnh (context-free syntax), trong đó vế trái của mỗi luật sinh chỉ có duy nhất một ký hiệu không kết thúc
Cú pháp phi ngữ cảnh biểu diễn được cú pháp của mọi ngôn ngữ lập trình cấp cao hiện nay
Trang 202.3 Ngữ nghĩa hình thức (Formal semantics)
Đặc tả ngữ nghĩa hình thức cho phép:
– Chứng minh tính đúng đắn của chương trình
– Kiểm tra tính đúng đắn của chương trình dịch
Các dạng ngữ nghĩa hình thức
– Ngữ nghĩa tác vụ (Operational semantics)
– Ngữ nghĩa tiên đề (Axiomatic semantics)
– Ngữ nghĩa biểu thị (Denotational semantics)
Trang 22và hệ điều hành gây khó hiểu
– Định nghĩa ngữ nghĩa phụ thuộc vào máy tính
Phương pháp tương đương tốt hơn: sử dụng máy ảo
Trang 23Ngữ nghĩa tác vụ
Dùng ngữ nghĩa tác vụ để đặc tả ngữ nghĩa một ngôn ngữ lập trình
L cần
– Bộ chuyển đổi (translator) đổi L thành ngôn ngữ cấp thấp
– Sử dụng máy ảo cho ngôn ngữ cấp thấp
goto Loop;
out:…
Trang 25c) Ngữ nghĩa biểu thị
Ở ngữ nghĩa biểu thị, ngữ nghĩa của mỗi cấu trúc cú pháp được đặc tả bằng một ánh xạ, gọi là hàm ngữ nghĩa, từ miền cú pháp vào miền ngữ nghĩa
Trang 26Hiện thực và thiết kế ngôn ngữ
Cú pháp và ngữ nghĩa hình thức được dùng để hiện
thực và thiết kê ngôn ngữ lập trình
– Cú pháp hình thức được sử dụng để tạo ra bộ phân tích cú
Trang 272.4 Chương trình dịch
Sự biên dịch, sự thông dịch
Các giai đoạn của quá trình biên dịch
Sự ràng buộc
Trang 28Chương trình dịch
Chương trình dịch (translator) là chương trình nhập và chuyển đổi chương trình nguồn (source program) sang chương trình đối tượng (object program) hay chương
trình đích (target program)
– Chương trình nguồn viết bằng ngôn ngữ nguồn
– Chương trình đối tượng được thể hiện trên ngôn ngữ đối tượng
Thời gian chuyển đổi từ chương trình nguồn sang
chương trình đối tượng goi là thời gian dịch (compile
time)
Thời gian diễn ra sự thực thi chương trình đối tượng trên máy tính goi là thời gian thực thi (execution time hoăc
Trang 29Phân loại chương trình dịch
Gồm hai loại
– Trình biên dịch (compiler):chương trình nguồn được
trình biên dịch chuyển sang chương trình đích, thường ở dạng mã máy (hoặc assembly), sau đó chương trình đích mới được thực thi Trong hệ thống biên dịch dữ liệu và
chương trình nguồn được xử lý ở hai thời điểm khác nhau
Chương trình
nguồn
Chương trình biên dịch
Chương trình đối tượng Máy tính Kết quả
Dữ liệu
Trang 30Phân loại chương trình dịch (tiếp)
– Trình thông dịch (interpreter): Chương trình thông dịch đọc
chương trình nguồn theo từng lệnh và phân tích rồi thực hiện nó (VD: DOS).
– Một kiểu khác trong các hệ thống thông dịch là ngôn ngữ nguồn được chuyển sang ngôn ngữ trung gian, sau đó máy ảo (virtual machine) sẽ thực hiện chuyển ngôn ngữ trung gian sang ngôn ngữ máy (VD Java)
Dữ liệu
Trang 31Trình thông dịch Java
Text editor
Java virtual Machine
Operating
system
Java compiler
Source code (filename.java)
Bytecodes (classname.java) Java interpreter
Trang 32Ngôn ngữ biên dịch và thông dịch
Ngôn ngữ biên dịch là ngôn ngữ mà chương trình dịch cho nó là chương trình biên dịch, ví dụ như Fortran,
Pascal, C, C++…
Ngôn ngữ thông dịch là ngôn ngữ mà chương trình dịch cho nó là chương trình thông dịch, ví dụ như LISP, APL, Java,…
Trang 33Các giai đoạn của quá trình biên dịch
Một chương trình dịch được chia làm 6 giai đoạn:
Trang 34Phân tích từ vựng
Chương trình nguồn đối với chương trình dịch chỉ là một chuỗi kí hiệu
Bộ phân tích từ vựng dò các kí hiệu trong chuỗi kí hiệu chương trình nguồn, và gom chúng lại thành các nhóm kí hiệu có ý nghĩa gọi là các token, như từ khóa, tên biến, hằng, kí hiệu tác vụ.
VD phân tích từ vựng phép gán: c:=a+b*7 thu được:
c ident(định danh) b ident(định danh)
:= becomes(kí hiệu tác vụ gán) * times (kí hiệu tác vụ nhân)
a ident(định danh) 7 number (số/hằng)
+ plus(kí hiệu tác vụ cộng)
Chuỗi tokens thu được: id 1 :=id 2 +id 3 *7
(ident, c) becomes (ident, a) plus (ident, b) times (number, 7)
Trang 35Phân tích từ vựng
Source
program
Lexical analyzer
Get next token
Token
Parser
Symbol table
Trang 36Bảng danh hiệu (symbol table)
Trang 37hơn của chương trình nguồn
như: biểu thức, phát biểu,
chương trình con Các cấu trúc
được thể hiện dưới dạng cây
cú pháp với nút lá là các token.
Ví dụ cây cú pháp thu được
của phát biểu gán “c:=a+b*7“
Trang 38Phân tích ngữ nghĩa
– Kiểm tra lỗi ngữ nghĩa: kiểm tra kiểu; kiểm tra phạm vi của hằng, biến; kiểm tra việc sử dụng tên
– Thu nhận thông tin thuộc tính cho các từ tố (token), ví
dụ như thông tin về giá trị, thông tin về loại hằng, biến hay hàm cho tên.
chương trình nguồn VD trong biểu thức gán c:=a+b*7,
BPTNN xác định ý nghĩa của các tác vụ :=, +, *, kiểm tra
Trang 39Sinh mã trung gian
Sau khi phân tích cú pháp và ngữ nghĩa, trình biên dịch sẽ tạo ra dạng biểu diễn mã trung gian (mã bộ tứ, mã 3 địa chỉ) của chương trình nguồn
VD kết quả phân tích ngữ nghĩa phép gán biểu diễn bởi mã bộ tứ dạng
<toán tử> (<toán hạng 1>, <toán hạng 2>, <kết quả>) như sau:
CNV (7, , t1) (chuyển 7 sang giá trị thực)
* (id3, t1,t2) (t 2 =id 3 *t 1 )
+ (id2, t2, t3) (t 3 =id 2 +t 2 )
ASS (t3, ,id1) (gán giá trị t 3 và id 1 )
Trang 40Tối ưu mã
Giai đoạn này tối ưu mã trung gian để tạo ra được
chương trình đích tối ưu về tốc độ thực thi và bộ nhớ sử dụng
VD tối ưu mã cho mã trung gian của biểu thức
c:=a + b*7 là:
* (id 3 , 7.0, t 1 ) + (id 2 , t 1 , id 1 )
Trang 41Sinh mã
Giai đoạn cuối cùng là sinh ra mã đích thông thường ở dạng
mã máy hay mã Assembly Các vị trí vùng nhớ được chọn lựa cho mỗi biến được chương trình sử dụng Sau đó các lệnh trung gian được dịch lần lượt thành chuỗi các lệnh mã máy Vấn đề quyết định là việc gán các biến cho các thanh ghi.
VD mã assembly của phép gán c:=a+b*7
MOV Reg, id3;
MUL Reg, 7.0;
ADD Reg, id2;
MOV id 1 , Reg;
Trang 42Phân tích ngữ nghĩa (tiếp)
Việc phân tích ngữ nghĩa phải dựa vào các luật ngữ nghĩa đi kèm với từng luật cú pháp để thực hiện chức năng sinh thuộc tính cho các từ tố và kiểm tra lỗi ngữ nghĩa
Trang 43Ví dụ