Tải bản đầy đủ (.pdf) (75 trang)

Bài giảng Chương trình dịch: Phần 1 - ĐH Sư phạm kỹ thuật Nam Định

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (754.97 KB, 75 trang )

Mơc lơc
LỜI NĨI ĐẦU ............................................................................................................ 7
Chƣơng 1. TỔNG QUAN VỀ CHƢƠNG TRÌNH DỊCH .......................................... 9
1.1. Mở đầu ............................................................................................................ 9
1.2. Chƣơng trình dịch ......................................................................................... 11
1.2.1. Các khái niệm ........................................................................................ 11
1.2.2. Mơ hình phân tích - tổng hợp của một chƣơng trình dịch ..................... 12
1.2.3. Mơi trƣờng của chƣơng trình dịch ......................................................... 13
1.3. Phân tích chƣơng trình nguồn ...................................................................... 14
1.3.1. Phân tích từ vựng (Lexical Analysis) .................................................... 14
1.3.2. Phân tích cú pháp (Syntax Analysis) ..................................................... 16
1.3.3. Phân tích ngữ nghĩa (Semantic Analysis) .............................................. 17
1.4. Các giai đoạn của chƣơng trình dịch ............................................................. 18
1.4.1. Quản lý bảng ký hiệu ............................................................................. 19
1.4.2. Xử lý lỗi ................................................................................................. 19
1.4.3. Các giai đoạn phân tích .......................................................................... 20
1.4.4. Sinh mã trung gian ................................................................................. 20
1.4.5. Tối ƣu mã ............................................................................................... 21
1.4.6. Sinh mã đích .......................................................................................... 21
1.5. Nhóm các giai đoạn ....................................................................................... 21
1.5.1. Kỳ đầu (Front End) ................................................................................ 22
1.5.2. Kỳ sau (Back End) ................................................................................. 22
1.6. Các đặc trƣng của ngôn ngữ lập trình bậc cao .............................................. 22
1.6.1. Từ vựng .................................................................................................. 22
1.6.2. Cú pháp .................................................................................................. 23
1.6.3. Ngữ nghĩa ............................................................................................... 23
CÂU HỎI VÀ BÀI TẬP CHƢƠNG 1 ..................................................................... 24
Chƣơng 2. PHÂN TÍCH TỪ VỰNG ........................................................................ 25
2.1. Nhắc lại một số kiến thức về văn phạm – ngôn ngữ - Automat.................... 25
2.1.1. Một số khái niệm cơ sở .......................................................................... 25
2.1.2. Biểu diễn ngôn ngữ ................................................................................ 26


2.1.3. Văn phạm ............................................................................................... 27
2.1.4. Văn phạm phi ngữ cảnh ......................................................................... 28
1


2.1.5. Biểu thức chính quy (Regular Expression)............................................ 29
2.1.6. Automat hữu hạn đơn định .................................................................... 31
2.1.7. Automat hữu hạn không đơn định - NFA (Nondeterministic Finite
Automata) ........................................................................................................ 31
2.1.8. Automat hữu hạn không đơn định với ε-dịch chuyển (NFAε) .............. 32
2.2. Giai đoạn phân tích từ vựng ......................................................................... 34
2.2.1. Thẻ từ, mẫu từ vựng và trị từ vựng (từ vị)............................................. 35
2.2.2. Nhận biết thẻ từ (token) ......................................................................... 40
2.3. Kỹ thuật đọc chƣơng trình nguồn ................................................................. 43
2.3.1. Cặp bộ đệm (Buffer Pairs) ..................................................................... 43
2.3.2. Khóa cầm canh (Sentinel) ..................................................................... 44
2.4. Kỹ thuật sử dụng Automat để phân tích từ vựng .......................................... 45
2.4.1. Giải thuật sử dụng DFA ......................................................................... 45
2.4.2. Giải thuật sử dụng NFA ......................................................................... 48
2.4.3. Giải thuật sử dụng NFA ....................................................................... 49
2.5. Kỹ thuật biến đổi Automat ............................................................................ 50
2.6. Giải thuật Thomson ....................................................................................... 61
CÂU HỎI VÀ BÀI TẬP CHƢƠNG 2 ..................................................................... 66
Chƣơng 3. PHÂN TÍCH CÚ PHÁP ......................................................................... 76
3.1. Giai đoạn phân tích cú pháp .......................................................................... 76
3.1.1. Vị trí, chức năng, nhiệm vụ của giai đoạn phân tích cú pháp ............... 76
3.1.2. Xử lý lỗi cú pháp ................................................................................... 77
3.1.3. Các chiến lƣợc phục hồi lỗi ................................................................... 77
3.1.4. Các phƣơng pháp phân tích cú pháp ...................................................... 78
3.2. Biến Ðổi văn phạm phi ngữ cảnh ................................................................ 79

3.2.1. Cây phân tích cú pháp (Parsing tree) và dẫn xuất ................................. 79
3.2.2. Ngôn ngữ nhập nhằng (Ambiguity) ....................................................... 82
3.2.3. Kỹ thuật khử nhập nhằng ....................................................................... 83
3.2.4. Kỹ thuật khử đệ quy trái ........................................................................ 84
3.2.5. Kỹ thuật thừa số hố bên trái ................................................................. 88
3.3. Phân tích cú pháp từ trên xuống................................................................... 93
3.3.1. Phân tích cú pháp đệ quy xuống ............................................................ 93
3.3.2. Phân tích cú pháp dự đốn (phân tích LL(1)) ........................................ 96
2


3.4. Phân tích cú pháp từ dƣới lên (Bottom - up parsing) .................................. 117
3.4.1. Phân tích đẩy thu ( Shift – Reduce parsing) ........................................ 118
3.4.2. Phân tích cú pháp thứ bậc tốn tử ........................................................ 124
3.4.3. Phân tích LR(K) ................................................................................... 127
3.4.4. Giải thuật phân tích LR ........................................................................ 128
3.4.5. Xây dựng bảng phân tích cú pháp ....................................................... 133
CÂU HỎI VÀ BÀI TẬP CHƢƠNG 3 ................................................................... 146
LỜI GIẢI TÓM TẮT HOẶC HƢỚNG DẪN ........................................................ 155
TÀI LIỆU THAM KHẢO ...................................................................................... 218

3


DANH MỤC HÌNH VẼ
Hình 1.1. Mơ tả việc dịch các chƣơng trình sang Assembly ................................... 10
Hình 1.2. Sơ đồ một chƣơng trình dịch .................................................................... 11
Hình 1.3. Mơ hình phân tích - tổng hợp ................................................................... 12
Hình 1.4. Cây phân tích cú pháp .............................................................................. 12
Hình 1.5. Cấu trúc mơi trƣờng của chƣơng trình dịch ............................................. 14

Hình 1.6. Một cây phân tích cú pháp ....................................................................... 16
Hình 1.7. Sơ đồ cấu trúc của một chƣơng trình dịch .............................................. 18
Hình 2.1. NFA với ε - dịch chuyển .......................................................................... 35
Hình 2.2. Vị trí của giai đoạn phân tích từ vựng ...................................................... 35
Hình 2.3. Sơ đồ chuyển nhận dạng token relop ....................................................... 42
Hình 2.4. Mơ phỏng cặp bộ đệm .............................................................................. 44
Hình 2.5. Sơ đồ mơ tả Automat đốn nhận biểu thức b*a+bb .................................. 46
Hình 2.6. Biểu diễn automat bằng đồ thị.................................................................. 47
Hình 2.7. Đồ thị biểu diễn Automat ......................................................................... 48
Hình 2.8. NFA với ε - dịch chuyển .......................................................................... 49
Hình 2.9. Sơ đồ giải thuật......................................................................................... 52
Hình 2.10. Biểu diễn automat bằng đồ thị................................................................ 52
Hình 2.11. Biểu diễn automat bằng đồ thị................................................................ 54
Hình 2.12. Biểu diễn automat bằng đồ thị................................................................ 55
Hình 2.13. Biểu diễn automat bằng đồ thị................................................................ 56
Hình 2.14. Sơ đồ giải thuật....................................................................................... 57
Hình 2.15. Biểu diễn automat bằng đồ thị................................................................ 57
Hình 2.16. Biểu diễn automat bằng đồ thị................................................................ 60
Hình 2.17. Automat đốn nhận biểu thức r=  ......................................................... 61
Hình 2.18. Automat đốn nhận biểu thức r = a ........................................................ 61
Hình 2.19. Automat đốn nhận biểu thức r = s+t ..................................................... 61
Hình 2.20. Automat đốn nhận biểu thức r=st ......................................................... 62
Hình 2.21a. Automat đốn nhận biểu thức r = s* ..................................................... 62
Hình 2.21b. Automat đốn nhận biểu thức r = s+ ..................................................... 62
Hình 2.22. Các automat đốn nhận a, b ................................................................... 64
Hình 2.23. Automat đốn nhận r7 = a+b ................................................................. 64
Hình 2.24. Automat đốn nhận r5 = (a+b)* .............................................................. 65
Hình 2.25. Automat đốn nhận r=(a b)*abb ............................................................ 65
Hình 3.1. Vị trí của bộ phân tích cú pháp ................................................................ 77
Hình 3.2. Minh họa một cây phân tích cú pháp ....................................................... 80

4


Hình 3.3. Minh họa một cây phân tích cú pháp ....................................................... 81
Hình 3.4. Xây dựng cây phân tích cú pháp từ dẫn xuất ........................................... 82
Hình 3.5. Hai cây phân tích cú pháp của xâu id + id * id ........................................ 83
Hình 3.6. Hai cây phân tích cú pháp của cùng một xâu ........................................... 84
Hình 3.7 a, b, c. Mơ tả q trình phân tích xâu w = cad ......................................... 94
Hình 3.8. Sơ đồ chuyển của một biến....................................................................... 97
Hình 3.9. Sơ đồ chuyển cho các biến ....................................................................... 99
Hình 3.10. Sơ đồ chuyển rút gọn ............................................................................ 100
Hình 3.11. Mơ tả hình tổ chức dữ liệu của kỹ thuật dự đốn ................................. 104
Hình 3.12. Cây phân tích cú pháp cho xâu vào id + id * id ................................... 107
Hình 3.13. Mơ hình phân tích đẩy - thu ................................................................. 121
Hình 3.13a. Cây phân tích cú pháp cho xâu vào id * id +id theo đẩy – thu ......... 121
Hình 3.14. Mơ hình bộ phân tích cú pháp LR ........................................................ 128
Hình 3.14a. Cây phân tích cú pháp cho xâu vào id * id + id theo LR .................. 128
Hình 3.15. Sơ đồ chuyển ........................................................................................ 142

5


DANH MỤC BẢNG
Bảng 2.1. Các ví dụ về token ................................................................................... 38
Bảng 2.2. Biểu thức chính quy cho một số token ................................................... 41
Bảng 2.3. Mơ phỏng automat đốn nhận từ bbaaabb ............................................... 46
Bảng 2.4. Mơ phỏng automat đốn nhận từ aaabba ................................................. 47
Bảng 2.5. Mơ tả q trình đốn nhận xâu ................................................................ 49
Bảng 2.6. Mơ tả q trình đốn nhận xâu ................................................................ 50
Bảng 2.7. Mô phỏng giải thuật ................................................................................. 54

Bảng 2.8. Mô phỏng giải thuật ................................................................................. 55
Bảng 2.9. Mô phỏng giải thuật ................................................................................. 60
Bảng 3.1. Bảng phân tích cú pháp ......................................................................... 107
Bảng 3.2. Phân tích cú pháp cho xâu vào id + id * id ............................................ 107
Bảng 3.3. Bảng phân tích cú pháp .......................................................................... 113
Bảng 3.4. Bảng phân tích cú pháp .......................................................................... 114
Bảng 3.5. Bảng phân tích cú pháp M phục hồi lỗi ................................................. 116
Bảng 3.6. Phân tích cú pháp cho xâu vào + id * + id phục hồi lỗi ........................ 117
Bảng 3.7. Q trình phân tích đẩy thu xâu id1 + id2* id3 ....................................... 123
Bảng 3.8. Các quan hệ thứ bậc toán tử ................................................................... 125
Bảng 3.9. Bảng quan hệ thứ bậc các toán tử .......................................................... 125
Bảng 3.10. Bảng phân tích cú pháp ........................................................................ 131
Bảng 3.11. Q trình phân tích xâu id*id+id ......................................................... 132
Bảng 3.12. Mơ phỏng giải thuật đốn nhận xâu id1 + id2* id3 ............................... 135
Bảng 3.13. Bảng phân tích cú pháp LR(1) ............................................................. 144

6


LỜI NĨI ĐẦU

LỜI NĨI ĐẦU
Chương trình dịch (compiler) là bộ mơn khoa học quan trọng của khoa học
máy tính. Ở nhiều nước trên thế giới, mơn học “Chương trình dịch” đã trở thành
môn học bắt buộc và là cơ sở của các ngành thuộc lĩnh vực công nghệ thông tin. Ở
nước ta, hiện nay nhiều trường đại học cũng đang giảng dạy môn học này cho sinh
viên các ngành khoa học máy tính và cơng nghệ thơng tin. ... Tuy nhiên tài liệu phục
vụ giảng dạy cho môn học ở nước ta cịn ít, thời lượng dành cho mơn học cũng cịn
rất khác nhau ở mỗi trường. §Ĩ cã mét nội dung thống nhất cho các ngành thuc
lĩnh vực công nghệ thông tin của Tr-ờng, tr-ờng Đại học S- phạm Kỹ thuật Nam

Định, Trng đà ban hành ch-ơng trình chi tiÕt cho m«n häc. Việc xuất bản tập đề
cương bài giảng nhằm đáp ứng nhu cầu cung cấp tài liệu môn học cho việc giảng
dạy của giảng viên và học tập của sinh viên các ngành thuộc khoa Công nghệ
Thông tin trường Đại học Sư phạm Kỹ thuật Nam Định nói riêng và làm tại liệu
tham khảo cho sinh viên và cán bộ giảng dạy các trường nói chung.
Tập đề cương bài giảng “Chương trình dịch” được biên soạn theo chương
trình chi tiết mơn học “Chương trình dịch” của trường Đại học Sư phạm Kỹ thuật
Nam Định. Mục tiêu của tập đề cương bài giảng nhằm cung cấp các kiến thức cơ
bản, tổng quan về chương trình dịch. Giúp sinh viên hiểu được các kiến thức cơ
bản, tổng quan về chương trình dịch nói chung và các kỹ thuật cơ bản trong xây
dựng các bộ phân tích từ vựng và phân tích cú pháp của các chương trình dịch của
các ngơn ngữ lập trình bậc cao. Đây là các kiến thức nền tảng, làm cơ sở cho việc
xây dựng ra các ngơn ngữ lập trình bậc cao và các chương trình dịch. Về nội dung,
tập đề cương bài giảng được chia thành 3 chương:
Chương 1. Tổng quan về chương trình dịch
Chương này trình bày: Các khái niệm, kiển thức cơ bản về chương
trình dịch. Mơi trường của chương trình dịch. Các giai đoạn của chương trình dịch.
Nhóm các giai đoạn của chương trình dịch. Các đặc trưng cơ bản của ngơn ngữ lập
trình bậc cao.
Chương 2. Phân tích từ vựng
Chương này nhắc lại một số kiến thức về văn phạm, ngơn ngữ,
Automat. Trình bày các kiến thức về thẻ từ, mẫu từ vựng và trị từ vựng; vị trí, nhiệm
vụ của giai đoạn phân tích từ vựng; một số kỹ thuật đọc chương trình nguồn; kỹ
thuật sử dụng Automat để phân tích từ vựng và kỹ thuật biến đổi automat.
Chương 3. Phân tích cú pháp

7


LỜI NĨI ĐẦU


Chươngnày trình bày các kiến thức cơ bản về: Vị trí, nhiệm vụ của giai
đoạn phân tích cú pháp và các phương pháp phân tích cú pháp. Các kỹ thuật biến
đổi văn phạm: khử đệ quy trái, thừa số hố bên trái, khử nhập nhằng. Phương pháp
phân tích top – down: phân tích cú pháp đệ quy xuống, phân tích cú pháp dự đốn.
Phương pháp phân tích bottom – up: phân tích cú pháp đẩy thu, phân tích cú pháp
LR(k).
Đặc biệt cuối mỗi chương còn đưa ra hệ thống câu hỏi, bài tập nhằm củng
cố, khắc sâu, nâng cao và vận dụng các kiến thức vào giải các bài tập và cuối cùng
là phần lời giải tóm tắt hoặc hướng dẫn cho các bài tập nhằm giúp sinh viên tự rèn
luyện kỹ năng và kiểm tra kiến thức.
Trong q trình biên soạn, tập đề cương bài giảng khơng tránh khỏi những
sai sót, rất mong đồng nghiệp và các sinh viên đóng góp ý kiến để tập đề cương bài
giảng ngày càng được hoàn thiện hơn.
Người biên soạn

Phạm Hùng Phú

8


Chƣơng 1. Tổng quan về chƣơng trình dịch

Chƣơng 1
TỔNG QUAN VỀ CHƢƠNG TRÌNH DỊCH
Mục tiêu:
Giúp sinh viên có khả năng:
- Hiểu đƣợc các khái niệm cơ bản: Chƣơng trình dịch, hệ thống thông dịch,
biên dịch.
- Hiểu đƣợc môi trƣờng của một chƣơng trình dịch.

- Hiểu đƣợc cấu trúc của một chƣơng trình dịch
- Hiểu đƣợc các giai đoạn của chƣơng trình dịch: vị trí, nhiệm vụ.
- Biết đƣợc các đặc trƣng cơ bản của ngơn ngữ lập trình bậc cao.
Nội dung chính:
- Khái niệm chƣơng trình dịch.
- Mơi trƣờng của chƣơng trình dịch.
- Các giai đoạn của chƣơng trình dịch.
- Nhóm các giai đoạn của chƣơng trình dịch.
- Các đặc trƣng cơ bản của ngơn ngữ lập trình bậc cao.

1.1. Mở đầu
Các ngơn ngữ lập chƣơng trình thực chất là các ngôn ngữ dùng để biểu diễn
giải thuật thực hiện một bài tốn nào đó. Để thuận tiện và đơn giản cho quá trình viết
chƣơng trình ngƣời ta xây dựng các ngơn ngữ lập trình bậc cao nhƣ Algol, Pascal, C,
C++, Visual Fox, Visual Basic, … Hiện nay có rất nhiều ngơn ngữ lập trình bậc cao.
Những ngơn ngữ lập trình bậc cao có chung đặc tính là khơng phụ thuộc vào máy
tính, gần gũi với tốn học và các lĩnh vực hoạt động của con ngƣời. Chẳng hạn Visual
Fox là ngơn ngữ vừa gần gũi, thích hợp với cơng việc quản lý sản xuất, kinh doanh
vừa đủ chặt chẽ để diễn đạt các cơng thức tốn học và mang tính logic cao.
Viết chƣơng trình bằng ngơn ngữ máy có ƣu điểm cơ bản là chƣơng trình thực
hiện nhanh, vì khi nạp chƣơng trình vào máy tính nó chạy đƣợc ngay khơng cần giai
đoạn dịch, song nó có những nhƣợc điểm cơ bản sau:
- Ngôn ngữ máy rất xa lạ với ngơn ngữ tốn học và ngơn ngữ tự nhiên của con ngƣời.
- Dễ sinh ra lỗi, song lại khó phát hiện lỗi, mất nhiều thời gian hiệu chỉnh
chƣơng trình.
- Khó diễn đạt rõ ràng giải thuật.
- Phụ thuộc vào máy tính, khơng thuận tiện cho việc giao lƣu phổ biến các
chƣơng trình, các giải thuật tốn tốt, dẫn đến sự lãng phí về lao động xã hội.

9



Chƣơng 1. Tổng quan về chƣơng trình dịch

Những lý do nêu trên là nguyên nhân thúc đẩy việc sản sinh ra nhiều ngơn
ngữ lập trình bậc cao khác nhau. Trái ngƣợc với ngơn ngữ máy, ngơn ngữ lập trình
bậc cao có các đặc điểm sau:
- Gần gũi với ngơn ngữ tốn học và ngơn ngữ tự nhiên của con ngƣời.
- Không phụ thuộc vào máy cụ thể, do vậy dễ phổ biến, dễ giao lƣu trao đổi hợp
tác giữa những ngƣời làm chƣơng trình, tăng hiệu quả lao động của xã hội.
- Ít sinh ra lỗi, cho phép phát hiện lỗi nhanh và do vậy tiết kiệm thời gian hiệu
chỉnh chƣơng trình.
Về ngun tắc, các máy tính chỉ có thể thực hiện đƣợc các chƣơng trình viết
bằng ngơn ngữ máy. Vì vậy, các chƣơng trình viết bằng các ngơn ngữ lập trình bậc
cao muốn máy tính thực hiện đƣợc phải trải qua giai đoạn chuyển ngơn ngữ lập trình
bậc cao sang ngôn ngữ máy. Giai đoạn chuyển ngôn ngữ lập trình bậc cao sang ngơn
ngữ máy đƣợc gọi là giai đoạn dịch chƣơng trình hay ngắn gọn là dịch. Chƣơng trình
thực hiện giai đoạn dịch gọi là chƣơng trình dịch (Compiler). Đối với chƣơng trình
dịch thì các chƣơng trình viết bằng ngơn ngữ lập trình bậc cao là dữ liệu đầu vào và
đƣợc gọi là chƣơng trình nguồn; chƣơng trình là kết quả dịch (đầu ra) của chƣơng
trình dịch đƣợc gọi là chƣơng trình đích. Ngơn ngữ dùng để viết chƣơng trình nguồn
ta gọi là ngơn ngữ nguồn. Ngơn ngữ dùng để viết chƣơng trình đích ta gọi là ngơn
ngữ đích.
Trong thực tế với mục đích tận dụng các chƣơng trình tốt đã có, viết bằng các
ngơn ngữ lập trình bậc cao khác nhau; ngƣời ta thƣờng dịch các chƣơng trình nguồn
ra ngơn ngữ trung gian sau đó ghép chúng lại thành một chƣơng trình viết bằng cùng
một ngơn ngữ sau đó mới chuyển sang ngơn ngữ máy. Thậm chí có những chƣơng
trình đƣợc viết bằng nhiều ngơn ngữ lập trình khác nhau, ngƣời ta gọi là chƣơng trình
viết ở dạng hợp ngữ. Hình 1.1 mơ tả việc dịch các chƣơng trình viết bằng các ngơn
ngữ khác nhau sang chƣơng trình viết bằng ngơn ngữ trung gian Assembly.

Chƣơng trình
Trong C

Chƣơng trình
Trong C++
Assembly
Chƣơng trình
Trong Assembly

Chƣơng trình
trong Pascal

Hình 1.1. Mơ tả việc dịch các chương trình sang Assembly

10


Chƣơng 1. Tổng quan về chƣơng trình dịch

- Về bản chất, mọi chƣơng trình viết bằng một ngơn ngữ lập trình bậc cao đều
đƣợc coi là một dãy ký hiệu và đƣợc gọi là xâu vào hay văn bản vào. Do vậy, q
trình dịch có thể coi là q trình biến đổi một xâu vào hay văn bản vào viết ở ngôn
ngữ này thành một xâu ra hay văn bản ra viết bằng ngơn ngữ khác sao cho nó bảo
tồn “ngữ nghĩa” (Semantic) của xâu vào (chƣơng trình tƣơng đƣơng).
Vấn đề bảo toàn “ngữ nghĩa” của văn bản vào là vấn đề chƣa đƣợc xác định rõ
ràng trong lý thuyết chƣơng trình dịch. Một số tác giả đã đƣa ra khái niệm bảo toàn
“ngữ nghĩa” nhƣ sau: Hai xâu đƣợc gọi là bản dịch của nhau nếu khi dịch sang ngơn
ngữ thứ ba thì chúng có kết quả nhƣ nhau.

1.2. Chƣơng trình dịch

1.2.1. Các khái niệm
1) Khái niệm chương trình dịch
Chƣơng trình dịch là một chƣơng trình làm nhiệm vụ đọc một chƣơng
trình đƣợc viết bằng một ngơn ngữ - ngơn ngữ nguồn (source language), rồi dịch nó
thành một chƣơng trình tƣơng đƣơng ở một ngơn ngữ khác - Ngơn ngữ đích (target
languague). Một phần quan trọng trong q trình dịch là ghi nhận lại các lỗi có
trong chƣơng trình nguồn để thơng báo lại cho ngƣời viết chƣơng trình.
Chƣơng trình
nguồn

Chƣơng
trình dịch

Chƣơng trình
đích

Báo lỗi
Hình 1.2. Sơ đồ một chương trình dịch
2) Biên dịch và thơng dịch
Ngƣời ta chia chƣơng trình dịch thành hai dạng là trình biên dịch và trình
thơng dịch.
a) Trình biên dịch (Compiler)
Trong hệ thống biên dịch, chƣơng trình dịch đọc tồn bộ chƣơng trình
nguồn và dịch tồn bộ chƣơng trình nguồn sang chƣơng trình đích.
- Chƣơng trình nguồn viết bằng ngơn ngữ lập trình bậc cao.
- Chƣơng trình đích viết bằng ngơn ngữ máy hoặc assembly hoặc ngơn ngữ
trung gian.
Chƣơng trình đích cần có khả năng chạy độc lập trên tất cả các máy mà
không cần chƣơng trình dịch nữa.
11



Chƣơng 1. Tổng quan về chƣơng trình dịch

Ƣu điểm của chƣơng trình dịch là chƣơng trình chạy nhanh. Nhƣợc điểm của
nó là việc thiết kế và cài đặt phức tạp.
Ví dụ nhƣ chƣơng trình dịch của Turbo C hay Turbo Pascal.
b) Trình thơng dịch (Interpreter)
Trong hệ thống thơng dịch, chƣơng trình dịch đọc vào từng câu lệnh, dịch
sang chƣơng trình đích rồi thực hiện ngay câu lệnh đó.
Ví dụ nhƣ chƣơng trình dịch của hệ điều hành DOS khi thực hiện lệnh tại
dấu nhắc lệnh hay chƣơng trình dịch của hệ quản trị cơ sở dữ liệu Visual Foxpro khi
thực hiện lệnh tại cửa sổ lệnh.
1.2.2. Mơ hình phân tích - tổng hợp của một chƣơng trình dịch
Chƣơng trình dịch thƣờng bao gồm hai q trình: phân tích và tổng hợp
- Phân tích  đặc tả trung gian
- Tổng hợp  chƣơng trình đích
Tổng hợp Chƣơng trình
Chƣơng trình Phân tích
Đặc
nguồn
tả trung gian
đích
Hình 1.3. Mơ hình phân tích - tổng hợp
Trong q trình phân tích chƣơng trình nguồn sẽ đƣợc phân rã thành một cấu
trúc phân cấp, thƣờng là dạng cây - cây cú pháp (parsing tree).
Ví dụ 1.1:
Câu lệnh gán position := initial + rate * 60 có cây phân tích cú pháp hình 1.4.
stmt
expr


id

assign expr
position

expr
operator

:=

id
+

initial

expr
expr
operator
id

number
*

rate
Hình 1.4. Cây phân tích cú pháp
12

60



Chƣơng 1. Tổng quan về chƣơng trình dịch

1.2.3. Mơi trƣờng của chƣơng trình dịch
Ngồi chƣơng trình dịch, cịn phải cần dùng nhiều chƣơng trình khác nữa để
tạo ra một chƣơng trình đích có thể thực thi đƣợc (executable). Các chƣơng trình đó
gồm: bộ soạn thảo, bộ tiền xử lý, trình dịch hợp ngữ, bộ tải và liên kết. Hệ thống các
chƣơng trình này giúp cho ngƣời lập trình có đƣợc một mơi trƣờng hồn chỉnh để
phát triển các ứng dụng.
- Bộ soạn thảo: cho phép soạn thảo chƣơng trình nguồn.
- Bộ tiền xử lý: Xử lý một số chức năng ban đầu để tạo ra một chƣơng trình
nguồn hồn chỉnh từ một chƣơng trình nguồn khung (nguyên thuỷ) ban đầu. Ví dụ,
một chƣơng trình nguồn có thể đƣợc phân thành các module và đƣợc lƣu trong các
tập tin riêng rẽ. Công việc tập hợp lại các tập tin này thƣờng đƣợc giao cho một
chƣơng trình riêng biệt gọi là bộ tiền xử lý (preprocessor). Bộ tiền xử lý có thể
"bung" các ký hiệu tắt đƣợc gọi là các macro thành các câu lệnh của ngơn ngữ
nguồn. Ngồi ra, bộ tiền xử lý cịn cho phép bỏ qua các chú thích.
- Chƣơng trình dịch: cho phép kiểm lỗi chƣơng chƣơng trình, dịch ra ngơn
ngữ đích. Dịch ra ngơn ngữ đích nhƣng đang ở dạng định vị lại đƣợc hay có thể ở
dạng ngơn ngữ assembly. Ngồi ra, chƣơng trình đích đƣợc tạo ra bởi chƣơng trình
dịch có thể cần phải đƣợc xử lý thêm trƣớc khi chúng có thể chạy đƣợc. Thơng
thƣờng, chƣơng trình dịch chỉ tạo ra mã lệnh hợp ngữ (assembly code) để trình dịch
hợp ngữ (assembler) dịch thành dạng mã máy định vị lại đƣợc.
- Tải/liên kết: Tải chƣơng trình vào bộ nhớ máy tính và liên kết với một số
thủ tục trong thƣ viện hệ thống để tạo thành một chƣơng trình mã máy tuyệt đối và
thực thi đƣợc trên máy tính.
Hình sau trình bày sơ đồ cấu trúc mơi trƣờng của một chƣơng trình dịch
trong một hệ thống biên dịch điển hình.

13



Chƣơng 1. Tổng quan về chƣơng trình dịch

Chƣơng trình nguồn khung (nguyên thuỷ)
Bộ tiền xử lý
Chƣơng trình nguồn
Trình biên dịch

Chƣơng trình đích hợp ngữ
Trình dịch hợp ngữ

Mã máy khả tái định vị
Trình tải / Liên kết

Thƣ viện, Tập
tin đối tƣợng
định vị lại đƣợc

Mã máy tuyệt đối
Hình 1.5. Cấu trúc mơi trường của chương trình dịch

1.3. Phân tích chƣơng trình nguồn
Q trình phân tích chƣơng trình nguồn, về mặt logic có thể chia thành ba
giai đoạn phân tích: Phân tích từ vựng, phân tích cú pháp và phân tích ngữ nghĩa.
1.3.1. Phân tích từ vựng (Lexical Analysis)
Trong một chƣơng trình dịch, giai đoạn phân tích từ vựng sẽ đọc chƣơng
trình nguồn từ trái sang phải (quét nguyên liệu - scanning) để tách ra thành các từ vị
(lexeme) và tìm ra các thẻ từ (token) tƣơng ứng cho các từ vị đó.
Thẻ từ là dạng ngữ pháp của từ vị; hay nói một cách khác, thẻ từ là tập hợp

xâu các ký tự kết thúc (từ vị) có chung nhau luật ngữ pháp sinh ra các từ vị đó và
mỗi thẻ từ thƣờng đƣợc đặt bởi một tên để định danh (phân biệt các thẻ từ với
nhau) .
Mỗi thẻ từ sẽ có một mẫu từ vựng (pattern) để xác định một từ vị là thuộc thẻ
từ nào; hay nói cách khác, mẫu từ vựng của thẻ từ là luật ngữ pháp sinh ra các từ vị
của thẻ từ đó.

14


Chƣơng 1. Tổng quan về chƣơng trình dịch

Từ vị của một thẻ từ là một từ của thẻ từ và nó phải thỏa mãn mẫu từ vựng
của thẻ từ đó.
Nhờ vào mẫu của thẻ từ, chƣơng trình dịch trong giai đoạn phân tích từ vựng
sẽ phân tích để xác định ra các thẻ từ trả về cho giai đoạn phân tích cú pháp hoặc
báo lỗi.
Ví dụ 1.2:
a) Trong một văn phạm có các luật sinh:
1. digit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Thì:
+ digit là thẻ từ (token);
+ 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 là mẫu từ vựng (pattern) của thẻ từ digit;
+ Mỗi chữ số: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 là một từ vị (lexeme) của thẻ từ digit.
2. letter A | B | ...| Z | a | b |...| z
Thì:
+ letter là thẻ từ (token);
+ A | B | ...| Z | a | b |...| z là mẫu từ vựng (pattern) của thẻ từ letter;
+ Mỗi chữ cái La tinh: A, B, C, …, Z, a, b, c, …, z là một từ vị (lexeme) của
thẻ từ letter.

3. id (letter | _ )(letter | digit | _ )

*

Thì:
+ id là thẻ từ (token);
*

+ (letter | _ )(letter | digit | _ ) là mẫu từ vựng (pattern) của thẻ từ id;
+ A, X1B, max_1a23 là 3 từ vị (lexeme) của thẻ từ id.
b) Trong một văn phạm có các luật sinh:
1. Stmt  id := expr
2. Expr  expr + exprexpr - exprexpr /exprexpr * expridnumber
3. Relop  +-*/
4. Assign  :=
Q trình phân tích từ vựng cho câu lệnh gán position:= initial + rate * 60 sẽ
tách thành các từ vị (lexeme) và trả về các thẻ từ (token) nhƣ sau:
1. position là từ vị của thẻ từ tên id
2. := là từ vị của thẻ từ phép gán assign
3. initial là từ vị của thẻ từ tên id
4. + là từ vị của thẻ từ phép toán operator

15


Chƣơng 1. Tổng quan về chƣơng trình dịch

5. rate là từ vị của thẻ từ tên id
6. * là là từ vị của thẻ từ phép toán operator
7. 60 từ vị của thẻ từ số nguyên number

Trong quá trình phân tích từ vựng các khoảng trắng (blank) sẽ bị bỏ qua.
1.3.2. Phân tích cú pháp (Syntax Analysis)
Giai đoạn phân tích cú pháp sẽ dựa vào bộ luật cú pháp để tìm cấu trúc cú
pháp của chƣơng trình nguồn. Các cấu trúc cú pháp này sẽ tƣơng ứng với một biểu
thức, một phép gán, một khai báo, câu lệnh điều kiện, câu lệnh lặp, … Trong nhiều
phƣơng pháp phân tích thì kết quả trả về không nhất thiết phải là cây cú pháp.
Giai đoạn phân tích cú pháp thực hiện cơng việc nhóm các thẻ từ của chƣơng
trình nguồn thành các ngữ đoạn văn phạm (grammatical phrase), mà sau đó sẽ đƣợc
chƣơng trình dịch tổng hợp ra thành phẩm. Thơng thƣờng, các ngữ đoạn văn phạm
này đƣợc biểu diễn bằng dạng cây phân tích cú pháp (parsing tree).
Về bản chất thì phân tích cú pháp sẽ cho ta thơng tin về cú pháp của chƣơng
trình nguồn và đƣợc thể hiện dƣới dạng cây phân tích cú pháp. Với ngơn ngữ đƣợc
đặc tả bởi các luật sinh thì giai đoạn phân tích cú pháp dựa vào các luật sinh để xây
dựng cây phân tích cú pháp.
Ví dụ 1.3:
Với câu lệnh gán position:= initial + rate * 60, giả sử bộ luật cú pháp của
ngôn ngữ để nhận biết câu lệnh gán đƣợc đặc tả bởi các luật sinh sau:
Stmt  id := expr
Expr  expr + exprexpr - exprexpr /exprexpr * expridnumber
Operator  +-*/
Assign  :=
Thế thì cây phân tích cú pháp của ví dụ trên sẽ đƣợc xây dựng nhƣ sau:
stmt
id
position

expr
assign expr
expr
operator

:=
id
expr
expr
+
operator
id

initial

*

number

rate
60
Hình 1.6. Một cây phân tích cú pháp
16


Chƣơng 1. Tổng quan về chƣơng trình dịch

Cấu trúc phân cấp của một chƣơng trình thƣờng đƣợc diễn tả bởi quy luật đệ quy.
Ví dụ 1.4:
1. Định danh (tên hay danh biểu - identifier) là một biểu thức (expr).
2. Số (number) là một biểu thức.
3. Nếu expr1 và expr2 là các biểu thức thì:
- expr1 + expr2;
- expr1 * expr2;
- (expr) cũng là những biểu thức.

Câu lệnh (statement) cũng có thể định nghĩa đệ quy:
1. Nếu id1 là một Danh biểu (tên hay định danh) và expr2 là một biểu thức
thì id1:= expr2 là một lệnh (stmt).
2. Nếu expr1 là một biểu thức và stmt2 là một lệnh thì:
- while (expr1) do stmt2;
- if (expr1) then stmt2 đều là các lệnh.
Ngƣời ta dùng các quy tắc đệ quy nhƣ trên để đặc tả luật sinh (production)
cho ngôn ngữ. Sự phân chia giữa q trình phân tích từ vựng và phân tích cú pháp
cũng tuỳ theo cơng việc thực hiện.
1.3.3. Phân tích ngữ nghĩa (Semantic Analysis)
Giai đoạn phân tích ngữ nghĩa sẽ thực hiện công việc:
- Kiểm tra các lỗi ngữ nghĩa của chƣơng trình nguồn: Kiểm tra kiểu, phạm vi
của hằng, biến; kiểm tra việc sử dụng trùng tên trùng nhau, ...
- Thu nhận thơng tin thuộc tính cho các thẻ từ; chẳng hạn, thông tin về giá
trị, thông tin về loại của hằng, biến hay hàm cho tên.
Một phần quan trọng trong giai đoạn phân tích ngữ nghĩa là kiểm tra kiểu
(type checking) và ép chuyển đổi kiểu. Chƣơng trình dịch, trong giai đoạn phân tích
ngữ nghĩa sẽ kiểm tra kiểu dựa vào các đặc tả của ngôn ngữ nguồn để xem các tốn
hạng của một tốn tử có hợp lệ hay không và thông báo lỗi nếu thấy lỗi.
Ví dụ 1.5:
Xét câu lệnh gán position:= initial + rate * 60;
Trong khai báo ta có:
Var position, initial: integer;
Rate: real;
Khi phân tích ngữ nghĩa:
- Khai báo thứ nhất cho biết position, initial có kiểu số nguyên.
- Khai báo thứ hai cho biết rate có kiểu số thực.

17



Chƣơng 1. Tổng quan về chƣơng trình dịch

- Câu lệnh gán cho biết vế phải của nó là kết quả của phép nhân một số thực
rate với một số nguyên rồi cộng với một số nguyên; vậy nó phải có kiểu thực. Cho
nên position phải có kiểu thực. Tuy nhiên khi so sánh lại thì mâu thuẫn. Vì vậy,
chƣơng trình dịch sẽ báo lỗi sai kiểu dữ liệu.
Nhƣng nếu trong khai báo:
Var position, initial, Rate: real;
Các tên biến đƣợc khai báo là real, 60 là số integer vì vậy chƣơng trình dịch
sẽ ép chuyển đổi số nguyên 60 thành số thực 60.0.
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 thẻ từ (token) và kiểm tra lỗi
ngữ nghĩa.

1.4. Các giai đoạn của chƣơng trình dịch
Để dễ hình dung, một chƣơng trình dịch đƣợc chia thành các giai đoạn, mỗi giai
đoạn chuyển chƣơng trình nguồn từ một dạng biểu diễn này sang một dạng biểu diễn
khác. Một cách phân rã điển hình chƣơng trình dịch đƣợc trình bày trong hình sau:
Chƣơng trình nguồn
Phân tích từ vựng

Phân tích cú pháp

Quản lý bảng ký
hiệu

Phân tích ngữ
nghĩa
Sinh mã trung gian


Tối ƣu mã
Sinh mã đích
Chƣơng trình đích
Hình 1.7. Sơ đồ cấu trúc của một chương trình dịch

18

Xử lý lỗi


Chƣơng 1. Tổng quan về chƣơng trình dịch

Việc quản lý bảng ký hiệu và xử lý lỗi đƣợc thực hiện xuyên suốt qua tất cả
các giai đoạn.
1.4.1. Quản lý bảng ký hiệu
Một nhiệm vụ quan trọng của chƣơng trình dịch là ghi lại các định danh (tên
hay danh biểu) đƣợc sử dụng trong chƣơng trình nguồn và thu thập các thơng tin về
các thuộc tính khác nhau của mỗi định danh. Những thuộc tính này có thể cung cấp
thơng tin về vị trí lƣu trữ đƣợc cấp phát cho một định danh, kiểu và tầm hoạt động
của định danh, và nếu định danh là tên của một thủ tục hoặc hàm thì thuộc tính là
các thơng tin về số lƣợng và kiểu của các đối số, phƣơng pháp truyền đối số và kiểu
trả về của thủ tục hoặc hàm nếu có.
Bảng ký hiệu (symbol table) là một cấu trúc dữ liệu mà mỗi phần tử là một
bản ghi dùng để lƣu trữ một định danh, bao gồm các trƣờng lƣu giữ ký hiệu và các
thuộc tính của nó. Cấu trúc này cho phép tìm kiếm, truy xuất các định danh (tên hay
danh biểu) một cách nhanh chóng.
Trong q trình phân tích từ vựng, định danh (tên hay danh biểu ) đƣợc tìm
thấy và nó đƣợc đƣa vào bảng ký hiệu nhƣng nói chung các thuộc tính của nó có thể
chƣa xác định đƣợc trong giai đoạn này mà nó đƣợc bổ sung dần trong các giai

đoạn phân tích cú pháp và phân tích ngữ nghĩa.
1
position
...
2
initial
...
3
4

rate

...

1.4.2. Xử lý lỗi
Mỗi giai đoạn có thể gặp nhiều lỗi, tuy nhiên sau khi phát hiện ra lỗi, tùy
thuộc vào chƣơng trình dịch mà có các cách xử lý lỗi khác nhau, chẳng hạn:
- Dừng và thông báo lỗi khi gặp lỗi đầu tiên (Turbo Pascal).
- Ghi nhận lỗi và tiếp tục quá trình dịch (Turbo C).
Giai đoạn phân tích từ vựng thƣờng gặp lỗi khi các ký tự không thể ghép
thành một token.
Giai đoạn phân tích cú pháp gặp lỗi khi các token khơng thể kết hợp với
nhau theo đúng cấu trúc cú pháp của ngơn ngữ.
Giai đoạn phân tích ngữ nghĩa báo lỗi khi các tốn hạng có kiểu khơng đúng,
sử dụng tên trùng nhau, yêu cầu của phép toán hay các cấu trúc khơng có nghĩa đối
với thao tác thực hiện mặc dù chúng hoàn toàn đúng về mặt cú pháp.

19



Chƣơng 1. Tổng quan về chƣơng trình dịch

1.4.3. Các giai đoạn phân tích
Giai đoạn phân tích từ vựng: đọc từng ký tự rồi gộp lại thành các từ vị
(lexeme), sau đó kiểm tra các mẫu để tìm ra các thẻ từ (token) tƣơng ứng, token có
thể là tên( định danh hay danh biểu), từ khóa, phép tốn, ...Chuỗi ký tự tạo thành
một thỏa mãn mẫu của một token gọi là lexeme - trị từ vựng (từ vị) của token đó.
Ví dụ 1.6:
Từ vị rate là một tên có token là tên (id), trị từ vựng (từ vị) là rate và tên này
sẽ đƣợc đƣa vào bảng ký hiệu nếu nó chƣa có trong đó.
Giai đoạn phân tích cú pháp và phân tích ngữ nghĩa: Xây dựng cấu trúc phân
cấp cho chuỗi các token, biểu diễn bởi cây cú pháp và kiểm tra ngôn ngữ theo cú
pháp.
1.4.4. Sinh mã trung gian
Sau khi phân tích ngữ nghĩa, một số chƣơng trình dịch sẽ tạo ra một dạng
biểu diễn trung gian của chƣơng trình nguồn. Có thể xem dạng biểu diễn này nhƣ
một chƣơng trình dành cho một máy trừu tƣợng. Chúng có 2 đặc tính quan trọng: dễ
sinh và dễ dịch thành chƣơng trình đích.
Dạng biểu diễn trung gian có rất nhiều loại. Thông thƣờng, ngƣời ta sử dụng
dạng "mã máy 3 địa chỉ" (three-address code), tƣơng tự nhƣ dạng hợp ngữ cho một
máy mà trong đó mỗi vị trí bộ nhớ có thể đóng vai trị nhƣ một thanh ghi.
Mã máy 3 địa chỉ là một dãy các lệnh liên tiếp, mỗi lệnh có thể có tối đa 3
đối số.
Ví dụ 1.7:
Trong ví dụ trên, sau các giai đoạn phân tích thì mã trung gian sẽ đƣợc tạo ra
nhƣ sau:
t1:= inttoreal (60)
t2:= id3 * t1
t3:= id2 + t2
id1:= t3

(Trong đó id1 là position; id2 là initial; id3 là rate )
Dạng trung gian này có một số tính chất:
- Mỗi lệnh chỉ chứa nhiều nhất một tốn tử. Do đó khi tạo ra lệnh này,
chƣơng trình dịch phải xác định thứ tự các phép tốn, ví dụ * thực hiện trƣớc +.
- Chƣơng trình dịch phải tạo ra một biến tạm để lƣu trữ giá trị tính tốn cho
mỗi lệnh.
- Một số lệnh có ít hơn 3 tốn hạng.

20


Chƣơng 1. Tổng quan về chƣơng trình dịch

1.4.5. Tối ƣu mã
Giai đoạn tối ƣu mã cố gắng cải thiện mã trung gian để có thể có mã máy
thực hiện nhanh hơn. Một số phƣơng pháp tối ƣu hóa hồn tồn bình thƣờng.
Ví dụ 1.8:
Mã trung gian nêu trên có thể tối ƣu thành:
t1:= id3 * 60.0
id1:= id2 + t1
Để tối ƣu mã, ta thấy việc đổi số nguyên 60 thành số thực 60.0 có thể thực
hiện một lần vào lúc biên dịch, vì vậy có thể loại bỏ phép tốn inttoreal. Ngoài ra, t3
chỉ đƣợc dùng một lần để chuyển giá trị cho id1 nên có thể giảm bớt
Có một khác biệt rất lớn giữa khối lƣợng tối ƣu hoá mã đƣợc các chƣơng
trình dịch khác nhau thực hiện. Trong những chƣơng trình dịch gọi là "chƣơng trình
dịch chuyên tối ƣu", một phần thời gian đáng kể đƣợc dành cho giai đoạn này. Tuy
nhiên, cũng có những phƣơng pháp tối ƣu giúp giảm đáng kể thời gian chạy của
chƣơng trình nguồn mà không làm chậm đi thời gian dịch quá nhiều.
1.4.6. Sinh mã đích
Giai đoạn cuối cùng của biên dịch là sinh mã đích, thƣờng là mã máy hoặc mã

hợp ngữ (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 chỉ thị trung gian đƣợc dịch lần lƣợt thành chuỗi các chỉ
thị mã máy. Vấn đề quyết định là việc gán các biến cho các thanh ghi.
Ví dụ 1.9:
Sử dụng các thanh ghi (chẳng hạn R1, R2) cho việc sinh mã đích nhƣ sau:
MOV id3, R2
MUL #60.0, R2
MOV id2, R1
ADD R2, R1
MOV R1, id1
Toán hạng thứ nhất và thứ hai của mỗi chỉ thị tƣơng ứng mô tả đối tƣợng
nguồn và đích. Dấu # để xác định số 60.0 xem nhƣ một hằng số.

1.5. Nhóm các giai đoạn
Các giai đoạn đã đề cập ở trên là thực hiện theo trình tự logic của một chƣơng
trình dịch. Nhƣng trong thực tế, cài đặt các hoạt động của nhiều hơn một giai đoạn
có thể đƣợc nhóm lại với nhau. Thơng thƣờng chúng đƣợc nhóm thành hai nhóm cơ
bản và đƣợc gọi là: kỳ đầu (Front end) và kỳ sau (Back end).

21


Chƣơng 1. Tổng quan về chƣơng trình dịch

1.5.1. Kỳ đầu (Front End)
Kỳ đầu bao gồm các giai đoạn hoặc các phần giai đoạn phụ thuộc nhiều vào
ngôn ngữ nguồn và hầu nhƣ độc lập với ngơn ngữ đích. Thơng thƣờng, nó chứa các
giai đoạn: Phân tích từ vựng, Phân tích cú pháp, Phân tích ngữ nghĩa và Sinh mã
trung gian. Một phần của cơng việc tối ƣu hóa mã cũng đƣợc thực hiện ở kỳ đầu.
Kỳ đầu cũng bao gồm cả việc xử lý lỗi xuất hiện trong từng giai đoạn.

1.5.2. Kỳ sau (Back End)
Kỳ sau bao gồm một số phần nào đó của chƣơng trình dịch phụ thuộc vào
ngơn ngữ đích và nói chung các phần này khơng phụ thuộc vào ngôn ngữ nguồn mà
là ngôn ngữ trung gian. Trong kỳ sau, sẽ gặp một số vấn đề nhƣ: tối ƣu hố mã, phát
sinh mã đích cùng với việc xử lý lỗi và các thao tác trên bảng ký hiệu.

1.6. Các đặc trƣng của ngơn ngữ lập trình bậc cao
1.6.1. Từ vựng
Cũng nhƣ ngôn ngữ tự nhiên, từ vựng của ngơn ngữ lập trình bậc cao đƣợc
xây dựng trên bảng chữ cái gồm có:
- Chữ cái: A . . Z, a .. z;
-

Chữ số: 0 .. 9;
Các ký hiệu toán học: +, -, *, /, =, <; >, (, ), %, ...
Các ký hiệu khác: [, ], {, }, ...

-

Dấu cách (khoảng trống).

Các từ vựng của ngôn ngữ lập trình bậc cao đƣợc hiểu bao gồm: Các từ khố,
các tên (hằng, biến, chƣơng trình, chƣơng trình con, kiểu dữ liệu), các kiểu dữ liệu,
các phép toán số học, các phép toán quan hệ, phép gán, các dấu, ...
Các từ vựng này có các quy định chặt chẽ về mặt ngữ pháp. Chẳng hạn nhƣ tên thì
bắt đầu bằng một chữ cái, sau đó là khơng, một hoặc nhiều các chữ cái hoặc chữ số; phép
gán trong ngôn ngữ C hoặc Foxpro là „=‟ cịn trong ngơn ngữ Pascal là „:=‟, ...
Các từ vựng đƣợc phân ta thành từng loại. Mỗi loại đƣợc đặt bởi một tên và
gọi là một thẻ từ (token). Mỗi loại có cấu trúc ngữ pháp riêng, quy định cách thức
xác định ra các từ của nó và đƣợc gọi là mẫu từ vựng (pattern). Mỗi từ vựng của

mỗi loại gọi là trị từ vựng hay từ vị (lexeme).
Để xây dựng một chƣơng trình dịch thì phải tìm hiểu tập từ vựng của ngơn
ngữ nguồn tức là tìm hiểu tập các thẻ từ và mẫu của các thẻ từ đó và phân tích để
biết đƣợc từng loại từ vựng và thuộc tính của nó. Nhiệm vụ này thuộc mơ đun phân
tích từ vựng.

22


Chƣơng 1. Tổng quan về chƣơng trình dịch

1.6.2. Cú pháp
Cú pháp là thành phần quan trọng nhất trong một ngôn ngữ. Ngôn ngữ đƣợc
sinh ra bởi một văn phạm gồm tập hợp các từ vựng thỏa mãn các luật sinh ra các từ
vựng đó. Các từ vựng ghép lại thành câu, câu phải thoả mãn các luật sinh ra câu của
văn phạm của ngơn ngữ đó. Các luật đó gọi là cú pháp của văn phạm.
Trong ngơn ngữ lập trình bậc cao, cú pháp của nó đƣợc thể hiệ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 một chƣơng trình, các câu
lệnh, … Các cấu trúc cần quan tâm đến bao gồm:
- Các khai báo (khai báo chƣơng trình, khai báo chƣơng trình con, khai báo
hằng, khai báo biến, khai báo kiểu dữ kiệu);
- Các biểu thức số học, biểu thức quan hệ, biểu thức logic;
- Các câu lệnh: lệnh gán, lệnh gọi chƣơng trình con, lệnh vào, ra dữ liệu, các
câu lệnh điều kiện, các câu lệnh lặp;
- Chƣơng trình, chƣơng trình con.
Nhiệm vụ trƣớc tiên là phải biết đƣợc bộ luật cú pháp của ngơn ngữ định xây
dựng chƣơng trình dịch cho nó.
Chƣơng trình phải phân tích chƣơng trình nguồn thành các cấu trúc cú pháp
của ngơn ngữ; từ đó, kiểm tra tính đúng đắn về mặt cú pháp của chƣơng trình
nguồn. Cơng việc này thuộc về mơ đun phân tích cú pháp.

1.6.3. Ngữ nghĩa
Kiểm tra ngữ nghĩa của chƣơng trình nguồn là một phần của chƣơng trình
dịch trong giai đoạn phân tích ngữ nghĩa. Ngữ nghĩa của ngơn ngữ lập trình liên
quan đến:
- Kiểu, phạm vi của hằng, biến, hàm biểu thức;
- Phân biệt và sử dụng đúng tên (tên hằng, tên biến, tên chƣơng trình , tên
chƣơng trình con, tên kiểu dữ liệu, …).
Chƣơng trình dịch phải kiểm tra đƣợc tính đúng đắn trong việc sử dụng các
đại lƣợng này. Chẳng hạn kiểm tra chỉ cho gán giá trị cho biến, kiểm tra tính đúng
đắn trong gán kiểu, kiểm tra phạm vi của hằng, biến, hàm; kiểm tra việc sử dụng tên
trùng nhau. Công việc này thuộc về mô đun phân tích ngữ nghĩa.

23


Chƣơng 1. Tổng quan về chƣơng trình dịch

CÂU HỎI VÀ BÀI TẬP CHƢƠNG 1
1.1. Nêu các khái niệm: chƣơng trình dịch, chƣơng trình thơng dịch (interpreter),
chƣơng trình biên dịch (compiler); mỗi khái niệm hãy cho một ví dụ.
1.2. Nêu các khái niệm: thẻ từ (token), từ vị (lexeme), mẫu từ vựng (pattern); cho ví
dụ minh họa.
1.3. Nêu mơi trƣờng của một chƣơng trình dịch. Trình bày sơ đồ cấu trúc mơi trƣờng
của một trình biên dịch.
1.4. Nêu các giai đoạn phân tích chƣơng trình nguồn và chức năng, nhiệm vụ của
nó.
1.5. Trình bày sơ đồ cấu trúc của một chƣơng trình dịch.
1.6. Nêu các nhóm giai đoạn của một trình biên dịch; chức năng, nhiệm vụ của mỗi
giai đoạn.
1.7. Nêu các đặc trƣng của ngơn ngữ lập trình bậc cao.

1.8. Chƣơng trình dịch của mỗi ngơn ngữ lập trình bậc cao sau sử dụng hệ thống
thông dịch hay biên dịch. Nêu phƣơng pháp ghi nhận lại các lỗi có trong
chƣơng trình nguồn để thơng báo lại cho ngƣời viết chƣơng trình của chƣơng
trình dịch đó:
- Pascal;
- C.
1.9. Các số khơng dấu trong Pascal là các chuỗi 5280, 39.37, 6.336E4 hoặc
1.894E-4. Ðịnh nghĩa chính quy sau mơ tả tập các số này là :
digit  0 | 1 |...| 9;
*

digits  digit(digit) ;
optional_fraction  . digits | ε;
optional_exponent  ( E ( + | - | ε ) digits) | ε;
num  digits optional_fraction optional_exponent.
Hãy chỉ rõ các thẻ từ (token), mẫu từ vựng (pattern), từ vị (lexeme) trong
ngôn ngữ trên.
1.10. Hãy chỉ ra một số thẻ từ (token); mẫu từ vựng (pattern) thƣờng gặp và một số
trị từ vựng tƣơng ứng của nó trong mỗi ngơn ngữ lập trình bậc cao: Pascal, C.

24


Chƣơng 2. Phân tích từ vựng

Chƣơng 2
PHÂN TÍCH TỪ VỰNG
Mục tiêu:
Giúp sinh viên có khả năng:
- Củng cố đƣợc một số kiến thức về văn phạm, ngôn ngữ và automat.

- Hiểu đƣợc các khái niệm: thẻ từ, mẫu từ vựng, trị từ vựng. Biểu diễn và
nhận biết đƣợc các thẻ từ.
- Biết đƣợc vị trí, nhiệm vụ của giai đoạn phân tích từ vựng.
- Hiểu đƣợc kỹ thuật đọc chƣơng trình nguồn.
- Chuyển đƣợc automat hữu hạn khơng đơn định về automat hữu hạn đơn
định.
- Xây đựng đƣợc automat hữu hạn khơng đơn định đốn nhận một biểu thức
chính quy.
- Nhận biết đƣợc từ vị bằng automat hữu hạn.
Nội dung chính:
- Nhắc lại một số kiến thức về văn phạm – ngôn ngữ - Automat.
- Thẻ từ, mẫu từ vựng và trị từ vựng (từ vị).
- Giai đoạn phân tích từ vựng.
- Kỹ thuật đọc chƣơng trình nguồn.
- Kỹ thuật sử dụng Automat để phân tích từ vựng.

2.1. Nhắc lại một số kiến thức về văn phạm – ngôn ngữ - Automat
2.1.1. Một số khái niệm cơ sở
- Bảng chữ cái (bộ chữ cái) là một tập hợp hữu hạn, khác rỗng các phần tử,
ký hiệu là . Các phần tử của một bảng chữ cái  đƣợc gọi là các chữ cái hoặc các
ký tự (character) hay ký hiệu (symbol).
- Xâu (string) hay từ (word) trên một bảng chữ cái  là một dãy hữu hạn gồm
một số lớn hơn hay bằng không các ký tự của bảng chữ cái đó; Trong đó, một ký tự
có thể xuất hiện nhiều lần.
- Xâu rỗng là xâu khơng có chữ cái nào, độ dài của xâu rỗng bằng không.
Xâu rỗng đƣợc ký hiệu là  hoặc e .
Ví dụ 2.1:
+ Tập hợp các chữ cái La tinh {a, b, c, …, A, B, …, Z } là một bảng chữ cái
và a, b, ..., A, ... là các chữ cái hay các ký tự.
+  = {0, 1} là một bảng chữ cái nhị phân. 0, 1 là các chữ cái của bảng chữ cái .

+ Aaab, bbbbb là các từ trên bảng chữ cái La Tinh.
25


×