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

Nghiên cứu tổng quan về chương trình dịch

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 (1.11 MB, 60 trang )

ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƢỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

----------Trần Thị Hoa

NGHIÊN CỨU TỔNG QUAN VỀ CHƢƠNG TRÌNH DỊCH
Chun ngành: Bảo đảm tốn học cho máy tính và HTTT
Mã số: 60 46 35

LUẬN VĂN THẠC SĨ KHOA HỌC

NGƢỜI HƢỚNG DẪN KHOA HỌC:
TS. Nguyễn Thị Minh Huyền

Hà Nội – Năm 2012


LỜI CẢM ƠN
Đầu tiên, em xin chân thành cảm ơn khoa Toán – Cơ – Tin học, trƣờng
Đại học Khoa học Tự nhiên – Đại học Quốc Gia Hà Nội đã tạo điều kiện cho em
thực hiện đề tài luận văn này.
Em xin chân thành cảm ơn các thầy cô khoa Toán – Cơ – Tin học đã
truyền đạt những kiến thức hữu ích tạo nền tảng vững chắc cho em định hƣớng
trong học tập và phát huy khả năng của mình.
Đặc biệt, em xin gửi lời cảm ơn chân thành và lời chúc sức khỏe đến cô
giáo Nguyễn Thị Minh Huyền đã hƣớng dẫn và chỉ bảo tận tình để em hồn
thành tốt luận văn của mình.
Em cũng xin gửi lời cảm ơn sâu sắc đến gia đình, bạn bè và đồng nghiệp
đã giúp đỡ, động viên và cổ vũ em trong suốt quá trình thực hiện luận văn.
Mặc dù cố gắng và nỗ lực hết mình, em vẫn cịn mắc nhiều thiếu sót trong
luận văn của mình, em hy vọng sẽ nhận đƣợc sự ủng hộ và đóng góp ý kiến để


hồn thiện đề tài này một cách tốt hơn.
.

2


MỤC LỤC
LỜI CẢM ƠN........................................................................................................2
MỤC LỤC..............................................................................................................3
DANH MỤC CÁC HÌNH VẼ................................................................................6
DANH MỤC CÁC BẢNG.....................................................................................7
MỞ ĐẦU................................................................................................................7
Chƣơng 1 - GIỚI THIỆU VỀ CHƢƠNG TRÌNH DỊCH....................................10
1.1. Chƣơng trình dịch ...................................................................................... 10
1.2. Các bƣớc thiết kế chƣơng trình dịch.......................................................... 10
1.2.1. Phân tích từ vựng.................................................................................... 11
1.2.2. Tổ chức bảng ký hiệu .............................................................................. 11
1.2.3. Phân tích cú pháp ................................................................................... 12
1.2.4. Phân tích ngữ nghĩa................................................................................ 12
1.2.5. Sinh mã trung gian ................................................................................. 13
1.2.6. Tối ưu mã................................................................................................ 13
1.2.7. Sinh mã đích ........................................................................................... 13
1.2.8. Phát hiện và thông báo lỗi ..................................................................... 14
Chƣơng 2 - PHÂN TÍCH TỪ VỰNG, CÚ PHÁP VÀ NGỮ NGHĨA................15
2.1. Ngơn ngữ và văn phạm hình thức.............................................................. 15
2.1.1. Bảng chữ cái........................................................................................ 15
2.1.2. Chuỗi (từ) ............................................................................................ 15
2.1.3. Ngôn ngữ ............................................................................................. 15
2.1.4. Văn phạm hình thức ............................................................................ 16
2.2. Phân tích từ vựng ....................................................................................... 18

2.2.1. Vai trị của bộ phân tích từ vựng ........................................................ 18

3


2.2.2. Thuộc tính của token ........................................................................... 20
2.2.3. Đặc tả token ........................................................................................ 21
2.3. Phân tích cú pháp ....................................................................................... 21
2.3.1. Vai trị của bộ phân tích cú pháp ........................................................ 21
2.3.2. Các chiến lược phân tích cú pháp ....................................................... 22
2.4. Phân tích ngữ nghĩa ................................................................................... 30
2.4.1. Định nghĩa ngữ nghĩa trực tiếp trong văn phạm ................................ 30
2.4.2. Lược đồ dịch ........................................................................................ 32
Chƣơng 3 - CÁC CƠNG CỤ HỖ TRỢ XÂY DỰNG CHƢƠNG TRÌNH
DỊCH....................................................................................................................33
3.1. Giới thiệu ................................................................................................... 33
3.2. Bộ sinh trình phân tích từ vựng FLEX ...................................................... 33
3.2.1. Cấu trúc............................................................................................... 33
3.2.2. Quy trình vận hành. ............................................................................ 34
3.3. Bộ sinh trình phân tích cú pháp BISON .................................................... 35
3.3.1. Cấu trúc............................................................................................... 35
3.3.2. Quy trình vận hành. ............................................................................ 37
Chƣơng 4 - XÂY DỰNG CHƢƠNG TRÌNH DỊCH CHO NGƠN NGỮ
MINIPAS.............................................................................................................38
4.1. u cầu ...................................................................................................... 38
4.2. Ngơn ngữ Minipas ..................................................................................... 38
4.2.1. Giới thiệu sơ lược ............................................................................... 38
4.2.2. Hướng dẫn sử dụng ngơn ngữ Minipas .............................................. 39
4.3. Xây dựng chƣơng trình dịch cho Minipas ................................................. 43
4.3.1. Xây dựng trình phân tích từ vựng cho Minipas .................................. 43


4


4.3.2. Xây dựng trình phân tích cú pháp cho Minipas.................................. 45
4.3.3. Xử lý ngữ nghĩa cho ngôn ngữ Minipas.............................................. 49
KẾT LUẬN..........................................................................................................59
TÀI LIỆU THAM KHẢO....................................................................................60

5


DANH MỤC CÁC HÌNH VẼ

Hình 2.1. Giao diện của bộ phân tích từ vựng ..................................................... 20
Hình 2.2. Giao diện của bộ phân tích cú pháp ..................................................... 21
Hình 2.3. Cây cú pháp từ dẫn xuất ....................................................................... 22
Hình 2.4. Cây chú thích cho biểu thức 3 * 5 + 4n ............................................... 32
Hình 3.1. Q trình phân tích từ vựng ................................................................. 35
Hình 3.2. Q trình phân tích cú pháp ................................................................. 37

6


DANH MỤC CÁC BẢNG
Bảng 2.1. Bảng ký hiệu của các token ................................................................. 19
Bảng 2.2. Bảng các  ij ......................................................................................... 30
Bảng 2.3. Biểu diễn ngữ nghĩa của văn phạm sinh biểu thức đơn giản ............... 31
Bảng 4.1. Bảng các token của ngơn ngữ Minipas................................................ 39
Bảng 4.1. Biểu thức chính quy xác định các token .............................................. 45


7


MỞ ĐẦU
Từ ngàn xƣa con ngƣời muốn giao tiếp với nhau phải dùng ngôn ngữ, vậy
ngƣời giao tiếp với máy tính tất nhiên cũng phải thơng qua ngơn ngữ. Con ngƣời
muốn máy tính thực hiện cơng việc, thì phải viết các u cầu đƣa cho máy bằng
ngơn ngữ máy có thể hiểu đƣợc. Việc viết các yêu cầu gọi là lập trình. Ngơn ngữ
dùng để lập trình đƣợc gọi là ngơn ngữ lập trình.
Việc viết chƣơng trình sẽ dễ dàng và tự nhiên hơn nếu ngơn ngữ lập trình
gần với cách diễn đạt của vấn đề cần giải quyết. Có nghĩa là, ngôn ngữ phải chứa
đựng các cấu trúc thuật ngữ - phần tử dùng để miêu tả vấn đề, và khơng phụ
thuộc vào máy tính cụ thể. Những ngơn ngữ lập trình có tính chất nhƣ trên đƣợc
gọi là ngôn ngữ bậc cao. Việc phân cấp ngôn ngữ lập trình đƣợc dựa trên cơ sở
của tính độc lập với máy tính ngày càng cao của các ngơn ngữ, bao gồm:
1 – Ngôn ngữ máy (machine language)
2 – Hợp ngữ (assembly language)
3 – Ngôn ngữ bậc cao (high level language)
Để giải quyết một vấn đề nào đó bằng tin học, lập trình viên phải tạo ra
các chƣơng trình nguồn bằng một ngôn ngữ bậc cao – ngôn ngữ gần với ngơn
ngữ nói. Nhƣng máy tính chỉ hiểu, chỉ chấp nhận ngơn ngữ bậc thấp, riêng của
mình, đó là chuỗi các số 0 và 1, tuy nhiên chuỗi số đó lại khơng gần gũi với con
ngƣời chút nào.
Bởi vì máy tính chỉ có thể hiểu ngơn ngữ máy cho nên một chƣơng trình
viết trong ngơn ngữ bậc cao cuối cùng rồi cũng đƣợc dịch sang ngơn ngữ máy.
Do đó cần phải có một cơng cụ để thực hiện việc chuyển đổi này, cơng cụ đó

8



đƣợc gọi là chương trình dịch. Để đáp ứng các nhu cầu về phần mềm ngày càng
gia tăng cả về số lƣợng và chất lƣợng, các thiết kế ngôn ngữ lập trình có nhiều
thay đổi dẫn đến các ngơn ngữ lập trình trở nên phức tạp hơn. Vì thế việc thiết kế
chƣơng trình dịch cũng tiếp tục thay đổi. Thiết kế và cài đặt chƣơng trình dịch
ln là một chủ đề nghiên cứu và phát triển thiết thực.
Do đó mục tiêu chính của đề tài là tìm hiểu về các bƣớc để thiết kế một
chƣơng trình dịch và xây dựng một chƣơng trình dịch cho một ngơn ngữ cụ thể
tự định nghĩa. Việc xây dựng thành cơng một chƣơng trình dịch hoàn chỉnh là rất
phức tạp, tốn nhiều thời gian và cần nhiều kiến thức.
Luận văn đƣợc trình bày thành bốn chƣơng:
+ Chƣơng I: Giới thiệu về chƣơng trình dịch.
+ Chƣơng II: Phân tích từ vựng, cú pháp và phân tích ngữ nghĩa.
+ Chƣơng III: Các cơng cụ hỗ trợ xây dựng chƣơng trình dịch.
+ Chƣơng IV: Xây dựng chƣơng trình dịch cho ngơn ngữ Minipas.Trong
q trình nghiên cứu tác giả khó tránh khỏi những sai sót, rất mong nhận đƣợc
nhiều ý kiến đóng góp từ các thầy giáo, cơ giáo và các bạn đọc để luận văn đƣợc
hoàn thiện hơn.

9


Chƣơng 1 - GIỚI THIỆU VỀ CHƢƠNG TRÌNH DỊCH
Chƣơng này trình bày kiến thức tổng quan về chƣơng trình dịch, đƣợc
trích từ tài liệu tham khảo [2, 4, 5].
1.1. Chƣơng trình dịch
Chƣơng trình dịch, cịn gọi là phần mềm biên dịch, là một chƣơng trình
máy tính làm cơng việc dịch một chuỗi các câu lệnh đƣợc viết bằng một ngôn
ngữ lập trình (ngơn ngữ nguồn hay mã nguồn), thành một chƣơng trình tƣơng
đƣơng nhƣng ở dƣới dạng một ngơn ngữ mới (gọi là ngơn ngữ đích hay mã đích)

và thƣờng là ngôn ngữ ở cấp thấp hơn, nhƣ ngôn ngữ máy.
Hầu hết các chƣơng trình dịch sẽ chuyển mã nguồn viết trong một ngôn
ngữ bậc cao thành mã đối tƣợng hay ngơn ngữ máy mà có thể đƣợc thi hành trực
tiếp bởi một máy tính hay bởi một máy ảo. Dù vậy, việc dịch từ một ngôn ngữ
bậc thấp sang một ngơn ngữ bậc cao hơn cũng có thể xảy ra, quá trình này
thƣờng đƣợc hiểu nhƣ là bộ biên dịch ngƣợc nếu nó có thể tái tạo lại một chƣơng
trình trong ngơn ngữ bậc cao. Cũng tồn tại các chƣơng trình dịch chuyển đổi từ
ngơn ngữ bậc cao này sang ngôn ngữ bậc cao khác, hay là chuyển đổi sang một
ngơn ngữ mà nó cần để tiếp tục xử lý về sau, những chƣơng trình dịch nhƣ vậy
đƣợc biết đến nhƣ là bộ biên dịch phân tầng.
1.2. Các bƣớc thiết kế chƣơng trình dịch
Chƣơng trình nguồn trong ngơn ngữ lập trình chính là chuỗi các ký tự.
Chƣơng trình dịch có nhiệm vụ chuyển chuỗi ký tự này sang chuỗi ký tự khác.
Quá trình này bao gồm các quá trình nhỏ hơn và đƣợc đặt tên nhƣ sau:
i)

Phân tích từ vựng

ii)

Phân tích cú pháp
10


iii)

Tổ chức bảng ký hiệu

iv)


Phân tích ngữ nghĩa

v)

Sinh mã trung gian

vi)

Tối ƣu mã

vii)

Sinh mã đích

viii)

Phát hiện và thơng báo lỗi

Đối với một chƣơng trình dịch tồn tại trong thực tế, thứ tự các bƣớc có thể
hơi khác so với thứ tự trên. Có thể một số bƣớc nhỏ kết hợp với nhau tạo thành
một bƣớc duy nhất.
1.2.1. Phân tích từ vựng
Là cơng việc đọc chƣơng trình nguồn từ trái sang phải (hay được gọi là
quá trình quét nguyên liệu) để tách ra thành các thẻ từ (token). Nói cách khác,
quá trình phân tích từ vựng là q trình dịch mà đầu nhập của nó là chuỗi các ký
tự, tƣợng trƣng cho chƣơng trình nguồn, đầu ra là các token. Dạng đầu ra này lại
là đầu nhập của quá trình phân tích cú pháp về sau.
Các token đƣợc nhận biết bởi q trình phân tích từ vựng và các thơng tin
(hay các thuộc tính) của từng token sẽ đƣợc lƣu trong bảng ký hiệu.
1.2.2. Tổ chức bảng ký hiệu

Bảng ký hiệu là một cấu trúc dữ liệu mà mỗi phần tử là một mẫu tin dùng
để lƣu trữ một token đƣợc bộ phân tích từ vựng nhận biết và các thơng tin của
token đó, 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 chúng ta tìm ra nhanh chóng mẫu tin của mỗi token và cũng có thể
lƣu trữ và truy xuất token một cách nhanh chóng.

11


Bảng ký hiệu thƣờng xuyên đƣợc truy xuất để thêm hoặc xuất các token,
do đó phải thỏa mãn hai điều kiện:
1)

Thực hiện nhanh các thao tác thêm token, hoặc các thơng tin
của token.

2)

Có khả năng truy xuất nhanh các thơng tin của một token.

Bảng ký hiệu có thể đƣợc tổ chức dƣới dạng danh sách liên kết hoặc bảng
băm.
1.2.3. Phân tích cú pháp
Các token đƣợc xuất ra từ q trình phân tích từ vựng có dạng (loại token,
thuộc tính), sẽ là chuỗi nhập vào của bộ phân tích cú pháp. Trong q trình phân
tích cú pháp, các token sẽ đƣợc kiểm tra xem có thể đƣợc biểu diễn bằng cấu trúc
cú pháp của ngơn ngữ lập trình cho trƣớc hay khơng?
Nhƣ vậy kết quả của q trình phân tích cú pháp của một chuỗi nhập là
cấu trúc cú pháp đƣợc biểu diễn bằng cấu trúc cây đƣợc gọi là cây cú pháp. Với
một chuỗi token là chuỗi nhập và một tập luật sinh cho trƣớc, bộ phân tích cú

pháp sẽ tự động tìm ra cây cú pháp cho chuỗi nhập. Khi cây cú pháp đƣợc xây
dựng xong thì quá trình phân tích cú pháp của chuỗi nhập cũng kết thúc thành
cơng. Ngƣợc lại, nếu bộ phân tích cú pháp áp dụng tất cả các luật sinh hiện có,
nhƣng khơng thể xây dựng đƣợc cây cú pháp của chuỗi nhập cho trƣớc thì bộ
phân tích cú pháp sẽ ra thơng báo rằng chuỗi nhập không đƣợc viết đúng cú pháp
của ngôn ngữ lập trình.
1.2.4. Phân tích ngữ nghĩa
Bộ phân tích ngữ nghĩa sẽ kiểm tra lỗi ngữ nghĩa của chƣơng trình nguồn
và thu nhận các thông tin về kiểu cho giai đoạn sau. Giai đoạn này sử dụng cây

12


cú pháp đƣợc xác định trong giai đoạn phân tích cú pháp với mỗi nút trên cây cú
pháp kết hợp với một tập thuộc tính để xác định tốn tử và toán hạng của các
biểu thức và câu lệnh.
Một nhiệm vụ quan trọng mà bộ phân tích ngữ nghĩa thực hiện là kiểm tra
kiểu dữ liệu. Dựa trên cây cú pháp, bộ phân tích ngữ nghĩa sẽ xử lý từng phép
tốn. Với mỗi phép tốn, nó sẽ xét các tốn hạng xem kiểu dữ liệu của chúng có
cho phép chúng tham gia vào phép tốn đó khơng?
1.2.5. Sinh mã trung gian
Sau giai đoạn phân tích cú pháp và 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.
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 ba đị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.
1.2.6. Tối ƣu mã
Giai đoạn tối ƣu mã cố gắng cải thiện mã trung gian bằng cách thu giảm
một số bƣớc trong mã trung gian để có thể có mã máy thực hiện nhanh hơn.

1.2.7. Sinh mã đích
Giai đoạn cuối của chƣơng trình dịch là sinh mã đích. Mã đích có thể là
mã máy hay mã hợp ngữ. 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 sẽ đƣợc dịch lần lƣợt thành
chuỗi các chỉ thị mã máy.

13


1.2.8. Phát hiện và thông báo lỗi
Mỗi giai đoạn của q trình dịch đều có thể gặp lỗi. Tuy nhiên sau khi
phát hiện ra lỗi, mỗi giai đoạn phải có cách xử lý lỗi để có thể tiếp tục dịch
chƣơng trình, và nhƣ thế cho phép phát hiện thêm nhiều lỗi khác trong chƣơng
trình nguồn. Một chƣơng trình dịch cứ phải dừng lại khi phát hiện lỗi sẽ không
đƣợc cho là hữu ích. Mỗi chƣơng trình dịch cũng 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 (Pascal).
- Ghi nhận lỗi và tiếp tục quá trình dịch (C).

14


Chƣơng 2 - PHÂN TÍCH TỪ VỰNG , CÚ PHÁP VÀ NGỮ NGHĨA
Nhƣ Chƣơng 1 đã trình bày, quá trình xây dựng một chƣơng trình dịch
gồm tám bƣớc. Trong chƣơng này sẽ đề cập chuyên sâu các bƣớc phân tích từ
vựng, phân tích cú pháp và phân tích ngữ nghĩa. Trƣớc khi đi vào tìm hiểu ba
bƣớc trên là nhắc lại kiến thức về ngôn ngữ và văn phạm đƣợc tham khảo từ [1].
2.1. Ngơn ngữ và văn phạm hình thức
2.1.1. Bảng chữ cái
Là một tập hữu hạn các ký hiệu, tập này thƣờng đƣợc ký hiệu bằng  .

2.1.2. Chuỗi (từ)
Cho  là bảng chữ cái, một chuỗi (hay một từ) w trên  là một dãy hữu
hạn các ký hiệu thuộc  đƣợc xếp liền kề nhau. Độ dài chuỗi w là số các ký
hiệu hợp thành w và đƣợc ký hiệu là w . Chuỗi rỗng ký hiệu là  , là chuỗi có độ
dài bằng khơng.
Tập tất cả các chuỗi trên  kể cả chuỗi rỗng đƣợc ký hiệu là  * .
Tập tất cả các chuỗi trên  không kể chuỗi rỗng đƣợc ký hiệu là   .
2.1.3. Ngôn ngữ
Ta gọi ngôn ngữ là một tập hợp các chuỗi trên một bảng chữ cái  nào đó.
Chẳng hạn  và   là các ngôn ngữ trên mọi bộ chữ  . Tập tất cả các chuỗi
trên một bảng chữ cái  ký hiệu là  * cũng là một ngôn ngữ. Mỗi ngôn ngữ trên
bảng chữ cái  là một tập con của  * .
Các phép tốn trên ngơn ngữ
 Ghép tiếp của ngôn ngữ L1 trên bảng chữ cái 1 với ngôn ngữ L2 trên bảng
chữ cái  2 , ký hiệu là L1 L2 , là một ngôn ngữ trên tập   1   2 chứa các

15


chuỗi có đƣợc bằng cách nối bất kỳ một chuỗi của ngôn ngữ L1 với một
chuỗi bất kỳ của ngôn ngữ L2
L1 L2  w | w  uv, u  L1 , v  L2 
*
 Bao đóng của ngôn ngữ L trên bảng chữ cái ∑ đƣợc ký hiệu là L với:

L*  L0  L1  L2  ...

trong đó Li đƣợc định nghĩa đệ quy sau:
1. L0   ,
2. Li  LLi1 với i  1 .


 Bao đóng dƣơng của ngơn ngữ L trên bảng chữ cái ∑ đƣợc ký hiệu là L

với:
L*  L1  L2  L3  ...

2.1.4. Văn phạm hình thức
Định nghĩa văn phạm: Một văn phạm G  ( N , , P, S ) là một bộ bốn,
trong đó:
• N : là tập hữu hạn các ký hiệu chƣa kết thúc hay các biến,
•  : là tập hữu hạn các ký hiệu kết thúc,
• P : là tập luật sinh của văn phạm,
• S  N : là ký hiệu bắt đầu của văn phạm.
Dẫn xuất (suy dẫn): Ta nói rằng A dẫn ra  (ký hiệu: A   )
nếu A   là một luật sinh,  và  là các chuỗi tùy ý các ký hiệu văn phạm.
Nếu 1   2  ...   n ta nói  1 dẫn ra (suy ra)  n
Ký hiệu

 : dẫn ra qua một bƣớc,
* : dẫn ra qua không hoặc nhiều bƣớc,

  : dẫn ra qua một hoặc nhiều bƣớc.

16


Ta có tính chất:
1.  *  với  ,
2.  *  và  *  thì  *  .
Ngôn ngữ sinh bởi văn phạm: Với văn phạm G có ký hiệu bắt đầu S .

Ta dùng quan hệ   để định nghĩa L(G) là ngôn ngữ đƣợc sinh ra bởi G . Chuỗi
trong L(G) có thể chỉ chứa một ký hiệu kết thúc của G . Chuỗi các ký hiệu kết
thúc w thuộc L(G) nếu và chỉ nếu S * w , chuỗi w đƣợc gọi là một câu của G .
2.1.5. Phân loại văn phạm
Dựa vào dạng của các luật sinh trong P để chia ra thành các lớp văn phạm
sau:
1. Văn phạm chính quy
2. Văn phạm phi ngữ cảnh
3. Văn phạm cảm ngữ cảnh
4. Văn phạm tổng quát
Trong luận văn, sẽ chỉ đề cập đến hai lớp văn phạm là văn phạm chính quy
đƣợc sử dụng trong bƣớc phân tích từ vựng và văn phạm phi ngữ cảnh đƣợc sử
dụng trong bƣớc phân tích cú pháp.
2.1.5.1. Văn phạm chính quy
Một văn phạm G  ( N , , P, S ) đƣợc gọi là tuyến tính phải nếu tất cả các
luật sinh có dạng: X  xB hoặc X  x , trong đó: X , B  N và x  * .
Một văn phạm G  ( N , , P, S ) đƣợc gọi là tuyến tính trái nếu tất cả các luật
sinh có dạng: X  Bx hoặc X  x , trong đó: X , B  N và x  * .
Một văn phạm đƣợc gọi là văn phạm chính quy nếu nó là văn phạm hoặc
tuyến tính trái hoặc tuyến tính phải.

17


Ngơn ngữ chính quy: Một ngơn ngữ L là chính quy khi và chỉ khi có một
văn phạm chính quy G sao cho L  L(G) .
Biểu thức chính quy: đƣợc xây dựng trên một tập hợp các luật xác định.
Mỗi biểu thức chính quy r đặc tả một ngơn ngữ L(r ) .
Sau đây là các luật xác định biểu thức chính quy trên bảng chữ cái  .
1.  là một biểu thức chính quy đặc tả cho một chuỗi rỗng  .

2. Nếu a   thì a là biểu thức chính quy biểu thị cho tập a, tập
chỉ chứa chuỗi a .
3. Giả sử r và s là các biểu thức chính quy đặc tả các ngơn ngữ
L(r ) và L(s) thì ta có:

a. (r ) | (s) là một biểu thức chính quy đặc tả L(r )  L(s) ,
b. (r )(s) là một biểu thức chính quy đặc tả L(r ) L(s) ,
c. (r )* là một biểu thức chính quy đặc tả ( L(r ))* .
2.1.5.2. Văn phạm phi ngữ cảnh
Văn phạm G  ( N , , P, S ) đƣợc gọi là văn phạm phi ngữ cảnh nếu tất cả các
luật sinh trong tập P có dạng: A  x , trong đó A N và x  ( N  )* .
Ngôn ngữ phi ngữ cảnh: Với G  ( N , , P, S ) là một văn phạm phi ngữ
cảnh. Ta gọi L là một ngôn ngữ phi ngữ cảnh khi và chỉ khi L  L(G) .
2.2. Phân tích từ vựng
2.2.1. Vai trị của bộ phân tích từ vựng
Phân tích từ vựng là giai đoạn đầu tiên của mọi chƣơng trình dịch. Nhiệm
vụ chủ yếu của nó là đọc chuỗi ký tự nhập vào rồi nhóm các ký tự thành các thẻ
từ hay đƣợc gọi là token.

18


Token là ký hiệu kết thúc trong văn phạm đối với một ngơn ngữ nguồn,
chẳng hạn nhƣ: từ khóa, tên, toán tử, dấu câu, hằng, chuỗi, ... Nếu tập các chuỗi
ký tự cùng đƣợc một luật miêu tả, luật đó đƣợc gọi là mẫu (pattern), sẽ đƣợc đặt
cùng một tên của token. Chuỗi ký tự đƣợc so trùng với một mẫu của token, đƣợc
gọi là trị từ vựng (lexeme) của token đó.
Token

Trị từ vựng


Ý nghĩa của mẫu

const

Const

Const

if

If

If

then

Then

Then

relation

<, <=, <>, =, >=, >

Các toán tử quan hệ

num

3.14, 2.5, 7.6


Hằng số bất kỳ

id

abc, x,y,….

Chuỗi gồm ký tự chữ cái và số bắt
đầu là ký tự chữ cái

literal

„abc‟

Chuỗi ký tự bất kỳ nằm giữa hai dấu „


Bảng 2.1. Bảng ký hiệu của các token
Sự tƣơng tác giữa bộ phân tích từ vựng và bộ phân tích cú pháp đƣợc thể
hiện nhƣ hình 2.1, trong đó bộ phân tích từ vựng đƣợc thiết kế nhƣ một thủ tục
đƣợc gọi bởi bộ phân tích cú pháp, trả về một token khi đƣợc bộ phân tích cú
pháp gọi.

19


Chƣơng trình

token
Bộ phân tích

từ vựng

nguồn

Bộ phân tích
cú pháp

Cấu trúc cú pháp

yêu cầu token

Bảng ký hiệu

Hình 2.1. Giao diện của bộ phân tích từ vựng
Chính sự tƣơng tác đơn giản này đã khiến cho bộ phân tích từ vựng tỏ ra
khá độc lập so với các phần còn lại của chƣơng trình dịch. Bộ phân tích từ vựng
chỉ liên hệ trực tiếp với bộ phân tích cú pháp trong vai trị nhƣ một thủ tục. Do
đó, một sự thay đổi dù lớn hay nhỏ ở bộ phân tích từ vựng cũng khơng gây ảnh
hƣởng đến hoạt động chung của chƣơng trình dịch.
2.2.2. Thuộc tính của token
Ta nhận thấy với cùng một mẫu có thể có nhiều trị từ vựng đƣợc so trùng
ví dụ: abc, af đều là token identifier (danh biểu) hay 123, 12 đều là token
num (chữ số). Vậy tên token chƣa mang đủ thông tin cho các giai đoạn sau, vì
lúc này chƣơng trình dịch cần biết cụ thể trị từ vựng và các thông tin khác nữa
nhƣ kiểu dữ liệu của trị từ vựng. Bộ phân tích từ vựng phải có nhiệm vụ chọn
thơng tin có liên quan đến token, để lƣu chúng vào bảng ký hiệu. Quá trình chứa
các thơng tin có liên quan đến token cịn đƣợc tiếp tục thực hiện trong giai đoạn
phân tích cú pháp, phân tích ngữ nghĩa…Ta cần phải có thơng tin để biết token
có trị từ vựng cho trƣớc, hiện ở đâu trong bảng ký hiệu. Cho nên token luôn
mang trong mình một thuộc tính là con trỏ để chỉ đến vị trí của nó trong bảng ký


20


hiệu. Khi một token đƣợc chuyển đến bộ phân tích cú pháp nó sẽ có dạng token, thuộc tính>.
2.2.3. Đặc tả token
Các token đƣợc đặc tả bởi biểu thức chính quy, điều đó có nghĩa là ta sử
dụng biểu thức chính quy để biểu diễn các token giúp cho bộ phân tích từ vựng
có thể dễ dàng nhận biết đƣợc token.
Ví dụ: Một số các biểu thức chính quy đặc tả cho các token:
Biểu thức chính quy A | B | ...... | Z | a | b | ... | z đặc tả cho token chữ cái (letter).
Biểu thức chính quy 0 | 1 | 2 | .... | 9 đặc tả cho token chữ số (digit).
Biểu thức chính quy letter|_(letter|digit|_)*

đặc tả cho token danh biểu

(identifier).
2.3. Phân tích cú pháp
2.3.1. Vai trị của bộ phân tích cú pháp

Chƣơng trình
nguồn

Bộ
phân
tích từ
vựng

token


Lấy token tiếp

Bộ
phân
tích cú
pháp

Cây cú pháp

Các
bƣớc
cịn lại

Biểu diễn
trung gian

Bảng ký hiệu

Hình 2.2. Giao diện của bộ phân tích cú pháp
Bộ phân tích cú pháp nhận chuỗi các token đƣợc xuất ra từ bộ phân tích từ
vựng và xác nhận rằng chuỗi này có thể đƣợc sinh ra từ văn phạm của ngôn ngữ
nguồn hay không bằng cách tạo ra cây cú pháp cho chuỗi. Bộ phân tích cú pháp
cũng có cơ chế ghi nhận các lỗi cú pháp theo một phƣơng thức linh hoạt và có

21


khả năng phục hồi đƣợc các lỗi thƣờng gặp để có thể tiếp tục xử lý phần cịn lại
của chuỗi nhập.

Mỗi ngơn ngữ lập trình đều có các quy tắc diễn tả cấu trúc cú pháp của các
chƣơng trình định dạng đúng. Các cấu trúc cú pháp này đƣợc mô tả bởi một văn
phạm phi ngữ cảnh.
Cây cú pháp: Một cây cú pháp có thể xem nhƣ một biểu diễn sơ đồ cho
một dẫn xuất, nó biểu thị làm thế nào dẫn ra một chuỗi của ngôn ngữ từ ký hiệu
khởi đầu của một văn phạm. Một cây cú pháp là cây có thứ tự trong đó các nốt
đƣợc gán nhãn với vế trái của luật sinh còn các con của các nốt biểu diễn bằng
vế phải tƣơng ứng của nó.
Ví dụ: Với dẫn xuất E  E  ( E)  ( E  E)  (id  E)  (id  id ) ta có
cây cú pháp nhƣ sau:
E

-

E

(

E

)

E

+

E

id


id

Hình 2.3. Cây cú pháp từ dẫn xuất
2.3.2. Các chiến lƣợc phân tích cú pháp
Có hai chiến lƣợc để thực hiện việc phân tích cú pháp:

22


 Chiến lƣợc phân tích cú pháp từ trên xuống (top – down),
 Chiến lƣợc phân tích cú pháp từ dƣới lên (bottom – up).
2.3.2.1. Chiến lƣợc phân tích từ trên xuống
Cho một văn phạm phi ngữ cảnh G  ( N , , P, S ) và một câu cần phân tích
w . Ta xuất phát từ điểm khởi đầu, nghĩa là từ S , áp dụng các suy dẫn trái, tiến từ

trái qua phải thử tạo ra câu đƣa vào phân tích w .
Một trong số các thuật tốn sử dụng chiến lƣợc phân tích từ trên xuống là
thuật tốn phân tích cú pháp Earley1.
2.3.2.1.1. Giới thiệu thuật tốn Earley
Earley là một thuật tốn thuộc loại phân tích cú pháp từ trên xuống và xây
dựng các dẫn xuất trái nhất của chuỗi ký tự nhập. Khi sử dụng thuật tốn Earley
chúng ta khơng phải đƣa văn phạm về một dạng chuẩn nào cả.
2.3.2.1.2. Mô tả sơ lƣợc thuật toán Earley
Cho G  ( N , , P, S ) là một văn phạm phi ngữ cảnh và w  a1a2 ...an là một từ
thuộc  * cần phân tích cú pháp. Ý tƣởng cơ bản của thuật tốn Earley nhƣ sau:


Xây dựng một dãy n  1 tập Earley I0, ..., In, trong đó I 0 là tập khởi

đầu, và mỗi tập I i (i > 0) ứng với một chữ cái ai . Mỗi phần tử của mỗi tập

này đƣợc gọi là một mục và có dạng sau: A  X 1 X 2 ...X k  X k 1... X m , i
(trong đó mỗi Xi là một ký hiệu văn phạm, dấu chấm nằm giữa X k và X k 1
là một ký hiệu không có trong N và  và i đại diện cho tập Earley chứa
luật trên)


1

Mỗi tập I j đƣợc xây dựng sao cho:

/>
23


 A     , i là ở trong I j , 0  i  j nếu và chỉ nếu tồn tại  và  sao
cho chúng ta có S * A và  * a1...ai và  * ai 1...a j . Ý nghĩa của mục
trên là: chúng ta đã nhìn thấy chuỗi nhập dẫn ra từ  đến vị trí j và đang
chờ chuỗi tiếp theo đƣợc dẫn ra từ  .
 A  , i là ở trong I j nếu có quy tắc sinh A   .


Sau khi hình thành danh sách tập Earley I 0 , I1 ,..., I n cho chuỗi nhập w ,

chúng ta kết luận w là một chuỗi thuộc ngôn ngữ L(G) nếu và chỉ nếu
trong I n có chứa ít nhất một mục có dạng S   ,0 .
2.3.2.1.3. Thuật tốn phân tích cú pháp Earley
Input: Văn phạm phi ngữ cảnh G  ( N , , P, S ) , chuỗi w  a1a2 ...an thuộc  *
Output: Danh sách các tập Earley: I 0 , I1 ,..., I n .
Thuật toán:



Đầu tiên chúng ta xây dựng tập I 0 nhƣ sau:
(1) Nếu S   là một luật sinh trong P thì ta cho S   ,0 vào trong I 0 , sau
đó thực hiện bƣớc (2) và (3) cho đến khi nào không thể thêm mục mới vào
trong I 0 đƣợc nữa.
(2) Nếu B   ,0 thuộc I 0 (chú ý:  có thể là  ) thì đƣa vào trong tập I 0
mục A  B   ,0 cho tất cả các mục có dạng A    B ,0 có trong I 0 .
(3) Nếu A    B ,0 là một mục trong tập I 0 thì ta đƣa vào I 0 các mục

B   ,0 cho tất cả các luật sinh có dạng


B   trong P .

Bây giờ chúng ta xây dựng tập I j sau khi đã có các tập I 0 , I1 ,..., I j 1

24


(4) Bƣớc quét (Scan): Với mỗi mục trong I j 1 có dạng B    a , i (với
a  a j ) thì cho mục B  a   , i vào trong I j . Thực hiện bƣớc (5) và (6)

cho đến khi khơng cịn mục mới đƣợc thêm vào.
(5) Bƣớc hoàn thành (Complete): Nếu A   , i là một mục trong I j , kiểm
tra xem trong tập I i các mục có dạng B    A , k  , với mỗi mục tìm
đƣợc nhƣ vậy ta cho vào trong I j mục B  A   , k .
(6) Bƣớc dự báo (Predict): Nếu A    B , i là một mục trong I j , tìm trong
P tất cả các luật sinh có dạng B   thì ta thêm mục B   , j  vào I j .

 Kết thúc thuật tốn khi j  n .

Ví dụ: Cho một văn phạm G với các luật sinh:
(1)

E T  E

(4)

T F

(2)

E T

(5)

F  (E )

(3)

T  F *T

(6)

F a

với chuỗi w  (a  a) * a
 Thực hiện thuật toán ta đƣợc kết quả:
I0

E  T  E,0

E  T ,0
TE 
 TF 
*TE,,00
T  F ,0
F  (E),0
F  a,0

I1
F  (E),0
E  T ,1
T  F *T ,1
T  F ,1
F  (E),1
F  a,1

25

I2
F  a,1
T  F  *T ,1
T  F ,1
E  T   E,1
E  T ,1
F  ( E),0


×