1. Trang chủ
  2. » Luận Văn - Báo Cáo

bài tập lớn chương trình dịch 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

62 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề 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
Tác giả Hoàng Xuân Trường, Nguyễn Văn Tuấn, Lê Thanh Tùng, Đoàn Phan Tiến Dũng
Người hướng dẫn Phạm Văn Cảnh
Trường học Trường Đại học Phenikaa
Chuyên ngành Công nghệ thông tin
Thể loại Bài tập lớn
Năm xuất bản 2023 - 2024
Định dạng
Số trang 62
Dung lượng 1,77 MB

Nội dung

Đề 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 1

TRƯỜ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 2

Bả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 5

Bà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 6

trự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 operator1operandoperator2operandend

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 7

Operand: 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 8

bool 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 9

current_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 11

Trong 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 12

I 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 15

Hình 2 các hàm hỗ trợ

Hình 3 các hàm hỗ trợ

Trang 16

Hì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 19

o 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 20

o 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 21

cá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 22

o 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 23

o 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 31

Hình 9 các hàm hỗ trợ

Hình 10 các hàm hỗ trợ

Trang 32

Hình 11 các hàm chính

Hình 12 các hàm chính

Trang 33

Hì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 35

o 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

Ngày đăng: 24/07/2024, 16:05

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w