Đề bàiBài 1.- Mô tả cách xây dựng một số biểu thức quan hệ hai ngôi trong ngônngữ lập trình C++?- Dựa vào mô tả trên, hãy xây dựng một bộ phân tích từ vựng nhậnbiết biểu thức quan hệ hai
Trang 1TRƯỜNG ĐẠI HỌC PHENIKAA
KHOA CÔNG NGHỆ THÔNG TIN
BÀI TẬP LỚN
TÊN HỌC PHẦN: CHƯƠNG TRÌNH DỊCH
Đề số 05
HỌC KỲ II NĂM HỌC 2023 – 2024 Giảng Viên Hướng Dẫn : Phạm Văn Cảnh
uni.edu.vn
Lê Thanh Tùng 21010655
21010655@st.phenikaa-uni.edu.vn Đoàn Phan Tiến Dũng 21012861 21012861@st.phenikaa-
uni.edu.vn
Trang 2Bảng Đánh Giá Phần Nhiệm Vụ Được Phân Công
STT Tên thành viên Công việc Đánh giá của
Trang 3Đề bài Bài 1.
- Mô tả cách xây dựng một số biểu thức quan hệ hai ngôi trong ngôn ngữ lập trình C++?
- Dựa vào mô tả trên, hãy xây dựng một bộ phân tích từ vựng nhận biết biểu thức quan hệ hai ngôi trong ngon ngu C++, gồm các
thành phần:
+ Đồ thị chuyển.
+Ô-tô-mát.
+ Lấy một ví dụ minh họa.
- Viết giả mã cho chương chương trình thực hiện yêu cầu trên?
Trang 4- Áp dụng thuật toán LL(1) xây dựng bảng phân tích cú pháp cho
Phan tích day (a or a) and a and a?
Bai 3 Cho luat sinh đoi voi lenh if then else như sau: S-> if E then T
else F.
- Hãy viết luật ngữ nghĩa cho lệnh while ở trên?
- Áp dụng sinh mã ba địa chỉ với câu lệnh sau: if a>b+2 then a=a-2
else a=a+1.
- Áp dụng sinh mã ba địa chỉ với lệnh: if (a>b) or (x<y) then x=a+1
else x=b+x+a.
Trang 5Bài 1:
I -Quan hệ hai ngôi trong ngôn ngữ lập trình C++ thườngđược sử dụng để so sánh giá trị của hai biểu thức Quan
hệ hai ngôi trả về một giá trị boolean (true hoặc
false) dựa trên kết quả của phép so sánh
-Để xây dựng một biểu thức quan hệ hai ngôi trong C++,
ta cần sử dụng toán tử so sánh và các toán hạng tương ứng Dưới đây là cách xây dựng một biểu thức quan hệ hai ngôi bằng cách sử dụng các toán tử so sánh:
+Chọn toán tử so sánh: Bạn cần chọn một trong các toán
tử so sánh (==, !=, >, <, >=, <=) tùy thuộc vào yêu cầucủa bạn
+Chọn toán hạng: Sau đó, bạn chọn các toán hạng cần so sánh Các toán hạng này có thể là biến, hằng số hoặc biểu thức khác
+Kết hợp toán tử và toán hạng: Bạn sử dụng toán tử đã chọn để so sánh các toán hạng Bạn có thể sử dụng nó
Trang 6trực tiếp trong các điều kiện if/else hoặc gán kết quả vào biến boolean.
II – Đồ thị tuyến
Dưới đây là một phiên bản của đồ thị tuyến mô tả cấu trúc cú pháp của các biểu thức quan hệ trong ngôn ngữ lập trình C++:
(relational) (logical)
Start operator1operandoperator2operandend
Trong đồ thị tuyến này:
+Start: Trạng thái bắt đầu
+Operator: Đại diện cho toán tử trong biểu thức quan
hệ Có thể là một toán tử so sánh hoặc toán tử logic.+Operand: Thể hiện toán hạng trong biểu thức quan hệ.+End: Trạng thái kết thúc
-Ô-tô-mát :
Trong ô-tô-mát này:
Start: Trạng thái bắt đầu
Operator1: Trạng thái biểu diễn một phần của toán tử trong biểu thức quan hệ
Trang 7Operand: Trạng thái biểu diễn một phần của toán hạng trong biểu thức quan hệ.
Operator2: Trạng thái biểu diễn một phần còn lại của toán tử trong biểu thức quan hệ
End: Trạng thái kết thúc của biểu thức quan hệ
Trang 8bool analyze(string expression)
{ for (char& c : expression) {
if (current_state == "Start")
{ if (isalpha(c)) {current_state = "Operator";
} else {cout << "Syntax error: Expected operand at the beginning." << endl;
return false;
c == '=') {
}} else if (current_state == "Operator")
{ if (c == '<' || c == '>' || c == '!'
||
Trang 9current_state = "Operand";
} else {cout << "Syntax error: Invalid operator '" << c << "'." << endl;
return false;
}} else if (current_state == "Operand")
{ if (isalpha(c)) {current_state = "Operator2";
} else {cout << "Syntax error: Expected operand after operator." << endl;
return false;
}} else if (current_state == "Operator2") {
if (c == '&' || c == '|') {current_state = "End";
} else {cout << "Syntax error: Invalid operator '" << c << "'." << endl;
return false;
}} else if (current_state == "End")
{ cout << "Syntax error: Unexpectedcharacter after expression." << endl;
return false;
}
Trang 10}}
Trang 11Trong mã trên:
Chúng ta định nghĩa một lớp
“RelationalExpressionAnalyzer” để thực hiện phân tích
cú pháp cho biểu thức quan hệ
Phương thức “analyze” lặp qua từng ký tự trong biểu thức và di chuyển giữa các trạng thái dựa trên các quytắc của biểu thức quan hệ
Nếu phân tích cú pháp thành công, phương thức “analyze”
sẽ trả về “true”, ngược lại sẽ trả về “false” và in ra thông báo lỗi tương ứng
Trang 12I Phân loại các thuật toán phân tích cú pháp:
1.Phân tích cú pháp thuật toán Bottom-up
a.Ý tưởng và thuật toán
❑ Cho văn phạm G với các luật sinh: 𝑆 → 𝐸 +𝑆|𝐸 𝐸 → 1|2|3|4|5|(𝑆) ❑ Xâu vào: 𝑊 = (1 + 2 +(3 + 4)) + 5
❑ Thu gọn W thành S: 1 + 2 + 3 + 4 +5←(𝐸 + 2+ (3 + 4)) + 5← ( 𝐸 + 𝐸 + (3 + 4)) + 5←(𝐸 + 𝐸+ (𝐸 + 4)) + 5← ( 𝐸 + 𝐸 + (𝐸 + 𝐸)) + 5←(𝐸 + 𝐸+ (𝐸 + 𝑆)) + 5← ( 𝐸 + 𝐸 + (𝑆)) + 5←(𝐸 + 𝐸 +𝐸) + 5← ( 𝐸 + 𝐸 + 𝑆) + 5←(𝐸 + 𝑆) + 5← ( 𝑆 ) +5←𝐸 +
5←𝐸 + 𝐸←𝐸 + 𝑆←S
Ý tưởng:
- Bottom-up bắt đầu từ các thành phần nhỏ(ví dụ: từ đơn) và xây dựng cây cú pháp
từ dưới lên
- Bottom-up bắt đầu từ các thành phần nhỏ(ví dụ: từ đơn) và xây dựng cây cú pháp
từ dưới lên
Trang 13- Thử sai và quay lui bằng năng lực tínhtoán của máy tính
- Dò ngược quá trình suy dẫn 𝑤 ← 𝑤𝑛−1 ← ⋯
← 𝑤1 ← 𝑆bằng kĩ thuật thu gọn: tìm xem
𝑤𝑖 có chứa vế phải của luật hay không,nếu có thì thay thế phần vế phải đóbằng vế trái tương ứng
+ Nếu một 𝑤𝑖 ≠ 𝑆thì chắc chắn nó cầnphải được thu-gọn,
+ Nếu 𝑤𝑖 không chứa vế phải của luật nào đó thì nhánh thử sai này cần quay
lui, ngược lại thì thu-gọn và thửtiếp
o Duyệt tất cả các luật sinh dạng 𝑥 → 𝛼, nếu 𝛼 là một chuỗi con trong A thì:
Trang 14- Áp dụng thu-gọn: thế α trong Abằng x, ta được A’
- Thử bước 2 với chuỗi A = A’
o Nếu không có phương án thu gọn nào thì quay lui
b.Cài đặt bottom-up đơn giản
Hình 1 cấu trúc 1 luật
Trang 15Hình 2 các hàm hỗ trợ
Hình 3 các hàm hỗ trợ
Trang 16Hình 5 các hàm chính
Hình 4 các hàm hỗ trợ
Trang 18+ Không vạn năng: không làm việc vớivăn phạm có suy dẫn rỗng (𝐴 →𝜖) hoặc
đệ quy (𝐴 →+ 𝐴)+ Không dễ loại bỏ những kết quả trùnglặp (trường hợp muốn tìm mọi phương
án suy dẫn)
- Ý tưởng cải tiến:
+ Quy hoạch động: sử dụng lại nhữngkết quả duyệt cũ
+ Cắt nhánh sớm: dựa trên đặc trưngcủa một số luật để loại bỏ cácphương án không có tương lai
2.Phân tích cú pháp thuật toán CYK
a.Khắc phục hạn chế của các phương pháp thử sai
Hai thuật toán thử-sai cơ bản top-down vàbottom-up đều có những hạn chế về văn phạmđầu vào
o Top-down: văn phạm không có đệ quy trái
o Bottom-up: văn phạm không có suy dẫnrỗng và không có kí hiệu đệ quy (A ⇒+A)
Các thuật toán thử-sai có hạn chế về mặttốc độ
o Tốc độ chấp nhận được với một số văn phạm đơn giản và đơn nghĩa, đầu vào ngắn
Trang 19o Trường hợp xấu có độ phức tạp tính toánhàm mũ
Không có cơ chế hiệu quả loại bỏ sự trùnglặp về kết quả (chẳng hạn như nhiều suy dẫntương đương)
Nguyên nhân của những hạn chế này
o Hạn chế do bản thân cơ chế hoạt độngcủa thử-sai
o Không có cơ chế loại bỏ các phương ánchắc-chắn-sai
b.Các phương pháp phân tích cú pháp vạn năng
Như vậy các thuật toán thử-sai có 2 điểm yếu
o Tạo ra thuật toán phân tích tốc độ cao
Tất nhiên nếu có thuật toán đạt được cả 2 mục tiêu trên thì quá tốt
Trong phần này ta nhắm tới mục tiêu thứ nhất
Có hai chiến lược:
o Biến đổi văn phạm G thành văn phạm G’tương đương nhưng không có những hạnchế của thuật toán
Trang 20o Thay đổi cơ chế của thuật toán, nóicách khác là không sử dụng cơ chế thử-sai hiện có
Chiến lược thứ nhất không có lời giải trọnvẹn
o Thuật toán khử đệ quy trái có thể thayđổi ý nghĩa của văn phạm, kết quả làvăn phạm G’ thực chất không hoàn toàntương đương G
o Khử suy dẫn rỗng hoặc kí hiệu đệ quylàm cho văn phạm khó hiểu, các kí hiệutrung gian mất ý nghĩa ban đầu của nó
c.Áp dụng quy hoạch động vào phân tích cú pháp
Quy hoạch động gồm hai ý tưởng cơ bản
o Chia bài toán lớn thành các bài toáncon độc lập
o Sử dụng bộ nhớ để lưu trữ lại các lờigiải của các bài toán con (để tránhviệc phải giải nhiều lần một bài toán)
Áp dụng vào bài toán phân tích văn phạm
o Cây phân tích 𝑆 ⇒∗ 𝑤 thực chất gồm cáccây con, mỗi cây con phân tích mộtchuỗi con liên tiếp trong w
o Sử dụng bộ nhớ để lưu trữ lại các kếtquả suy dẫn ra các chuỗi con của w (cónhiều chiến lược, chẳng hạn như lưu trữ
Trang 21các chuỗi từ 𝑤𝑖𝑤𝑖+1 …𝑤𝑗 hoặc chuỗi𝑤0𝑤1…𝑤𝑘, tùy vào mục tiêu cần lưu trữ).
d.Thuật toán cocke – younger – kasami (CYK)
Văn phạm phi ngữ cảnh ở dạng chuẩn Chomsky nếu mọi luật sinh đều có dạng A → BC hoặc A
các luật mới này thỏa mãn chuẩn Chomsky
CYK không phải là thuật toán vạn năng vì không chấp nhận văn phạm có suy dẫn rỗng
CYK minh họa một cách đơn giản ý tưởng quy hoạch động
Trang 22o Vấn đề bây giờ là tính 𝑋𝑖𝑗 như thế nào?
Chương trình:
Hạn chế
o Thuật toán không làm việc với suy dẫn rỗng
Trang 23o Số lượng kí hiệu trung gian terminal) nhiều, do việc chuyển đổi từCFG sang chuẩn Chomsky
(non- Độ phức tạp tính toán (xấu nhất) là𝑂(𝑛^3|𝐺|)
o Số n là độ dài của chuỗi w
o |G| là kích thước của văn phạm dạng CNF
Bản chất là ý tưởng bottom-up nhưng áp dụng các kĩ thuật quy hoạch động
Dễ dàng liệt kê mọi cây phân tích khác nhau và loại bỏ các suy dẫn trùng lặp
3.Phân tích cú pháp thuật toán Earley
a.Ý tưởng cơ bản
- Thuật toán Earley cụ thể hóa một automattuyến tính không quay lui (đi thẳng, từ trái qua phải)
- Trạng thái của automat: tập hợp các bộ quansát, một bộ quan sát thực chất là một biếnghi nhận quá trình diễn tiến của việc phântích văn phạm trong một tình huống cụ thểnào đó
- Khi nhận kí hiệu đầu vào, automat thực hiệnviệc cập nhật các bộ quan sát để xác định xem quá trình phân tích đã đến đâu
- Kết quả ở bước cuối cùng cho biết automatđoán nhận được những gì
Trang 24- Xét chuỗi vào 𝑤 = 𝑤0𝑤1…𝑤𝑛−1
- Thuật toán sử dụng một automat xử lý từ
trái sang phải (từ 𝑤0 sang đến W𝑛−1)
- Thuật toán sử dụng dấu chấm để ngăn giữa 2 phần của luật sinh trong quá trình áp dụngluật đó
- Nói cách khác, khi viết 𝐴 → 𝛼 • 𝛽, ta hiểu phần 𝛼 đã phân tích xong, còn phần 𝛽 thì chưa
- Một bộ quan sát [𝐴 → 𝛼 • 𝛽,𝑖]có nghĩa đang
xử lý luật 𝐴 → 𝛼 • 𝛽 từ vị trí 𝑤𝑖 trở đi
- Khi automat xét đến kí hiệu 𝑤𝑚, có thể cónhiều phương án phân tích khác nhau, tất cảcác phương án này đều được lưu lại để sửdụng trong các bước tính toán tiếp theo
- Tập hợp 𝑆(𝑚): tập các bộ quan sát dừng tại
vị trí m
- Như vậy, nếu [𝐴 → 𝛼 • 𝛽,𝑖]thuộc 𝑆(𝑚)có nghĩa
là dãy 𝑤𝑖𝑤𝑖+1…𝑤𝑚−1 được đoán nhận bởi phần αtrong luật sinh 𝐴 → 𝛼 • 𝛽
- Thuật toán cần phải sinh mọi thành phần trong𝑆(𝑚) trước khi chuyển sang kí hiệu 𝑤𝑚+1
- Thuật toán sẽ tính lần lượt S(0), S(1),…,S(n)
Trang 25- Để dễ dàng thực hiện thuật toán, thuật toán
bổ sung luật 𝑃 → 𝑆 vào tập luật (gọi làstart rule) và bổ sung bộ [𝑃 →• 𝑆,0] vàoS(0)
- Khi nhận kí hiệu 𝑤𝑚, automat sẽ bổ sung vàoS(m) các bộ quan sát phù hợp, quá trìnhtính
S(m) dừng khi không còn bộ quan sát nào cóthể thêm vào
- Sau khi tính xong S(n), nếu bộ [𝑃 → 𝑆 •,0]thuộc S(n) có nghĩa là dãy W0W1…𝑤𝑛−1 có thểsinh bởi S
- 3 lệnh cơ bản:
+ Prediction (dự đoán): với mọi bộ [𝑋 → 𝛼
• 𝑌 𝛽,𝑗]thuộc S(k), ta tìm mọi luật sinhdạng 𝑌 → 𝛾 và bổ sung bộ [𝑌 →• 𝛾,𝑘]vàoS(k)
+ Scanning (xét duyệt): với kí hiệu kếtthúc a = wk, tìm mọi bộ [𝑋 → 𝛼 • 𝑎 𝛽,𝑗]thuộc S(k), bổ sung vào S(k+1) bộ [𝑋 →𝛼
𝑎 • 𝛽,𝑗]
+ Completion (hoàn thành): với mọi bộ [𝑋 →
𝛾 •,𝑗]thuộc S(k), tìm trong S(j) mọi bộ[𝑌 → 𝛼 • 𝑋𝛽,𝑖],bổ sung [𝑌 → 𝛼 𝑋 •𝛽,𝑖]vào S(k)
b.Mã minh họa
Trang 26- Mã hàm chính
- Mã 3 lệnh cơ bản
c.Đánh giá thuật toán
- Nhiều phiên bản cài đặt sau này có sửa đổichút ít so với thuật toán gốc (thuật toánđược giới thiệu trong slide này cũng khôngphải thuật toán gốc)
Trang 27- Là một sự kết hợp thông minh của 3 trườngphái
+ Tiếp cận top-down (bước prediction)+ Tiếp cận bottom-up (bước scanning và completion)
+ Quy hoạch động (lưu lại trạng thái đểdùng lại)
- Không bị hạn chế văn phạm đầu vào
+ Do là top-down nên không bị hạn chế bởisuy dẫn rỗng
+ Dùng quy hoạch động không bị hạn chế bởi ký hiệu đệ quy (hoặc đệ quy trái)
- Làm việc trực tiếp với luật dạng CFG: khôngcần phải tách thành các luật chuẩn chomsky,
vì vậy kích cỡ tập luật không quá lớn
- Trong tình huống tổng quát: có độ phức tạptính toán 𝑂(𝑛3) với n là độ dài chuỗi vào
- Nếu văn phạm không có nhập nhằng: độ phức tạp tính toán cỡ 𝑂(𝑛2)
- Nếu văn phạm đơn giản (dạng LL, LR,…): độphức tạp cận tuyến tính ~O(n)
- Thực hiện đặc biệt tốt nếu văn phạm đệ quy trái
4.Phân tích cú pháp thuật toán Top – Down
a.Ý tưởng & thuật toán
Trang 28❑ Cho văn phạm G với các luật sinh: 𝑆 → 𝐸 + 𝑆|𝐸𝐸
𝑊𝑖 luôn chứa ít nhất một non-terminal
Xét X là non-terminal trái nhất của 𝑊𝑖:+ W không chứa non-terminal nên X sẽ phải
“biến mất”
+ Cách làm “biến mất” X chỉ có thể do sửdụng luật văn phạm mà vế trái là X
- Nhận xét: trước sau gì X cũng sẽ “biến mất”bởi một luật văn phạm có dạng 𝑋 → α
+ Top-down sử dụng năng lực tính toáncủa máy tính để thử các khả năng cóthể (phương pháp thử-sai-quay-lui)
Trang 29- Dò tìm quá trình suy dẫn 𝑆 ⇒ 𝑊1 ⇒ ⋯ ⇒ 𝑊:
+ Với 𝑊𝑖, tìm non-terminal X
+ Tìm luật dạng 𝑋 → 𝛼, áp dụng để suy diễn 𝑊𝑖 ⇒ 𝑊𝑖+1
+ Dừng nếu 𝑊𝑖+1 = 𝑊(tìm được phương án suy dẫn)
+ Thử với 𝑊𝑖+1 hoặc quay lui nếu đã xéthết phương án
- Đặc điểm của Top-down:
+ Nếu 𝑊𝑖 có chứa nhiều non-terminal thìchỉ cần thử với non-terminal trái nhất+ Trong số nhiều suy dẫn dạng 𝑆 ⇒∗ 𝑊,thuật toán sẽ tìm suy dẫn trái
Thuật toán top-down
+ Nếu A ≠ W: tìm kí hiệu trung gian trái nhất X
Trang 30+ Không tìm được X thì dừng, quay lui lại hàm gọi
+ Duyệt tất cả các luật sinh dạng X → α
Áp dụng luật đó trên A (ở vị trí X), ta được A’
Thử bước 2 với chuỗi A = A’
b.Cài đặt top-down đơn giản
Hình 8 cấu trúc 1 luật
Trang 31Hình 9 các hàm hỗ trợ
Hình 10 các hàm hỗ trợ
Trang 32Hình 11 các hàm chính
Hình 12 các hàm chính
Trang 33Hình 13 các hàm chính
c.Đánh giá về top down
- Thuật toán đơn giản, sử dụng sức mạnh của máytính để tìm kiếm lời giải
- Thuật toán dạng thử-sai-quay-lui, không cắt nhánh, độ phức tạp tính toán là hàm mũ (~ chậm)
- Thuật toán không vạn năng, không làm việc được với các văn phạm có đệ quy trái
- Lý do: vì không có cắt nhánh phù hợp, dẫn đếnviệc đi mãi theo chiều sâu mà không quay lui
- Tăng tính vạn năng của thuật toán:
+ Xử lý tình huống đệ quy trái bằng ràng buộc phù hợp \
Trang 34+ Biến đổi văn phạm trước khi bắt đầu sai-quay-lui
+ Sử dụng lại những kết quả đã duyệt cũ
5.Phân tích cú pháp thuật toán LL
a.Thuật toán về phân tích tất định
Hạn chế của các thuật toán trước
o Các thuật toán phân tích vạn năng (CYK,Earley)
- Phân tích mọi văn phạm phi ngữ cảnh
- Tốc độ chấp nhận được: 𝑂(𝑛3)với n là
độ dài chuỗi vào
Đối với những mã nguồn các ngôn ngữ lậptrình, giá trị của n có thể lên tới vàitriệu, bài toán phân tích văn phạm trở nên
rất đặc biệt
o Tốc độ chấp nhận được nếu là gần tuyếntính 𝑂(𝑛)
Trang 35o Văn phạm đơn giản, chặt chẽ, đơn nghĩa.
Hệ quả là nảy sinh nhu cầu xây dựng các bộphân tích văn phạm tất định(deterministic)
Thế nào là “tất định” – do ràng buộc độphức tạp tính toán là 𝑂(𝑛), hệ quả là:
o Khi nhận một kí hiệu đầu vào, bộ phântích văn phạm cần ngay lập tức quyếtđịnh sẽ sử dụng luật sinh nào chotrường hợp này
o Quyết định chọn luật sinh nào cần phải
đủ tốt để không phải thử lại phương ánkhác
o Tính chất “tất định” ~ không có quay lui
Cái giá phải trả cho sự “tất định”:
o Văn phạm sẽ không còn vạn năng nữa
o Nhưng văn phạm đủ tốt để dùng trongthực tế
Kiến trúc chung:
o Việc lựa chọn ngay lập tức phương ánsuy dẫn dẫn tới yêu cầu cần nghiên cứutrước bộ luật văn phạm và có các phương
án phù hợp trong các tình huống có thểxảy ra
o Các thuật toán phân tích tất định đều
sử dụng kĩ thuật xây dựng trước bảngphương án