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 langu
Trang 1ĐẠ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
Chuyên ngành: Bảo đảm toán học cho máy tính và HTTT
Trang 22
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 hoà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 để hoàn thiện đề tài này một cách tốt hơn
Trang 3
3
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
Trang 44
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 Yê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
Trang 55
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
Trang 66
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 Quá trình phân tích từ vựng 35
Hình 3.2 Quá trình phân tích cú pháp 37
Trang 77
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
Trang 88
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 yê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ụ đó
Trang 99
đượ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 luôn 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 quá 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
Trang 1010
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]
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
Trang 1111
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à quá 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 quá 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
Trang 1212
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ừ quá 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 quá 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 quá 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
Trang 1313
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 toá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 toán Với mỗi phép toán, nó sẽ xét các toá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 toá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
Trang 1414
1.2.8 Phát hiện và thông báo lỗi
Mỗi giai đoạn của quá 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)
Trang 1515
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]
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 toá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ữ L2trên bảng chữ cái 2, ký hiệu là L1L2, là một ngôn ngữ trên tập 1 2 chứa các
Trang 16• 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 nta nói 1dẫ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
Trang 1717
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
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
Trang 1818
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à slà các biểu thức chính quy đặc tả các ngôn 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
Trang 1919
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
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
Trang 2020
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ý
Cấu trúc cú pháp Chương trình
nguồn
Trang 21Ví 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
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ó
Bộ phân tích từ vựng
Bộ phân tích cú pháp
Bảng ký hiệu
token Lấy token tiếp
Cây cú pháp Chương trình
nguồn
Các bước còn lại
Biểu diễn trung gian
Trang 22Câ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) (EE) (idE) (idid) ta có cây cú pháp như sau:
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:
E
E
-
) ( E
E + E
Trang 2323
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 toán sử dụng chiến lược phân tích từ trên xuống là thuật toán phân tích cú pháp Earley1
2.3.2.1.1 Giới thiệu thuật toán Earley
Earley là một thuật toá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 toá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à wa1a2 a nlà một từ thuộc * cần phân tích cú pháp Ý tưởng cơ bản của thuật toán Earley như sau:
Xây dựng một dãy n 1tập Earley I 0 , ., I n, trong đó I0là tập khởi đầu, và mỗi tập I i (i > 0) ứng với một chữ cái a i 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:AX1X2 X kX k1 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 k1
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)
Mỗi tập I j được xây dựng sao cho:
1 http://en.wikipedia.org/wiki/Earley_parser
Trang 24 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 EarleyI0,I1, ,I ncho 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 toán phân tích cú pháp Earley
Input: Văn phạm phi ngữ cảnh G (N, ,P,S), chuỗi wa1a2 a n thuộc *
Output: Danh sách các tập Earley: I0,I1, ,I n
Thuật toán:
Đầu tiên chúng ta xây dựng tập I0 như sau:
(1) Nếu S là một luật sinh trong P thì ta cho S , 0 vào trong I0, 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 I0 được nữa
(2) Nếu B , 0 thuộc I0 (chú ý: có thể là ) thì đưa vào trong tậpI0
mục A B , 0 cho tất cả các mục có dạng A B , 0 có trong I0 (3) Nếu A B , 0 là một mục trong tậpI0 thì ta đưa vào I0 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ậpI j sau khi đã có các tập I0,I1, ,I j1
Trang 25(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 toán khi j n
Ví dụ: Cho một văn phạm G với các luật sinh:
(1) ETE (4) T F
(2) E T (5) F (E)(3) TF*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ả:
Trang 262.3.2.1.4 Độ phức tạp thời gian theo chiều dài chuỗi nhập
Thuật toán có độ phức tạp n3 vì các lý do sau:
Mỗi tác vụ Scan và Predict thực hiện một số hữu hạn bước trên một mục trong một tập bất kỳ Do vậy tổng số bước xử lý các mục trong tập I i cộng với các tác vụ Scan và Predict tỉ lệ với i (i)
Trong trường hợp xấu nhất, tác vụ complete thực thi i bước cho mỗi mục nó xử lý Do đó mất i2 bước trong I i
Trang 2727
Tính tổng I = 0, 1,…,n của i2 ta được n3 Vậy độ phức tạp của thuật toán Earley theo chiều dài chuỗi nhập là 0 (n3 )
2.3.2.2 Chiến lược phân tích dưới lên
Quá trình ngược lại với phân tích từ trên xuống, xuất phát từ chính câu cần phân tích w, bằng cách áp dụng thu gọn các suy dẫn phải, tiến hành từ trái qua phải để đi tới ký hiệu đầu của văn phạm
Một trong số các thuật toán sử dụng chiến lược phân tích từ trên xuống là thuật toán phân tích cú pháp CYK2 Đây là một thuật toán phân tích cú pháp trên văn phạm phi ngữ cảnh tổng quát Thuật toán mang tên của ba người tìm ra nó,
đó là J Cocke, D H Younger và T Kasami
2.3.2.2.1 Ý tưởng thuật toán
Ý tưởng chính của thuật toán như sau:
Giả sử có một văn phạm phi ngữ cảnh G (N, ,P,S) ở dạng chuẩn Chomsky3 và một chuỗi nhập wa1a2 a n
Thuật toán CYK sẽ đi xây dựng một bảng phân tích cú phápij (có hình một tam giác), mỗi phần tử ijvới 1 i nvà 1 jni 1 có các giá trị là một tập con của N
Một kí hiệu không kết thúc A thuộc ij nếu và chỉ nếu
1 1
Văn phạm G (N, ,P,S) được gọi là ở dạng chuẩn Chomsky nếu mọi luật sinh đều có dạng: A BC
hoặc A a, với A ,,B Clà các biến và a là một ký hiệu kết thúc.
Trang 28
28
2.3.2.2.2 Thuật toán phân tích cú pháp CYK
Cho một văn phạm phi ngữ cảnh G (N, ,P,S) và một chuỗi x bất kỳ Câu hỏi đặt ra là liệu x có thuộc L (G) hay không?
Để trả lời câu hỏi trên, ta dùng thuật toán CYK với thời gian tỉ lệ với x3 Giả sử văn phạm G đã ở dạng chuẩn Chomsky và x = n 1 Trước hết hãy chứng tỏ rằng có cách xác định với mỗi i, j và mỗi biến A, phải chăng A *
ij
x , trong đó x ij là chuỗi con của x kể từ vị trí i và có độ dài j
Quy nạp theo j:
- Với j 1, A * x ij khi và chỉ khi A x ij là một luật sinh
- Với j 1, thì A * x ij khi và chỉ khi có một luật sinh A BC và k,
Với cách làm đó, ta sẽ xác định được phải chăng S * x1n Nhưng vì x1n =
x Vậy x L (G) khi và chỉ khi S * x1n
Sau đây là thuật toán CYK thể hiện đường lối trên, trong đó ij là tập tất
cả các biến A sao cho A * x ij
Thuật toán CYK
(1) FOR i: 1 TO n DO
(2) i1:= {A | A a là một luật sinh và a là ký hiệu thứ i trong x}
Trang 29Bước (1) và (2) xử lý trường hợp j 1 Vì văn phạm G đã cho sẵn, cho nên bước (2) chiếm một khoảng thời gian cố định Vậy các bước (1) và (2) chiếm thời gian là 0 n( ) Các vòng lặp FOR ở các dòng (3) và (4) làm cho các bước từ (5) đến (7) lặp lại nhiều nhất là n2 lần (do i ,j n)
Bước (5) mỗi lần thực hiện chiếm một thời gian cố định Vậy tổng thời gian để thực hiện bước (5) là 0 (n2 ).Vòng lặp FOR ở dòng (6) làm cho bước (7) lặp lại 0 n( ) lần hoặc ít hơn Vì bước (7) cũng chiếm thời gian cố định, nên các bước (6), (7) gộp lại chiếm thời gian 0 n( )lần, tổng thời gian thực hiện cho bước (7) là 0 (n3 ).Vậy thời gian thực hiên toàn bộ thuật toán là ở cấp 0 (n3 )
Ví dụ: Xét văn phạm dạng chuẩn Chomsky:
BC AB
a BA
với chuỗi nhập là baaba
Áp dụng thuật toán CYK ta tính được bảng các ijnhư sau:
Trang 30Việc phân tích cú pháp và xử lý ngữ nghĩa thường thực hiện xen kẽ Mỗi khi bộ phân tích cú pháp nhận dạng ra một cấu trúc của chương trình nguồn (toán hạng, biểu thức, câu lệnh điều kiện, câu lệnh lặp ) thì nó sẽ gọi một chương trình con xử lý ngữ nghĩa chuyên trách tiếp nhận cấu trúc ấy
Để biểu diễn ngữ nghĩa, ta bổ sung thông tin ngữ nghĩa trực tiếp vào văn phạm và biểu diễn bằng lược đồ dịch
2.4.1 Định nghĩa ngữ nghĩa trực tiếp trong văn phạm
Để bổ sung ngữ nghĩa vào văn phạm ta dùng một văn phạm phi ngữ cảnh, trong đó mỗi ký hiệu văn phạm kết hợp với một tập các thuộc tính Mỗi luật sinh kết hợp với một tập các luật ngữ nghĩa Việc đánh giá các luật ngữ nghĩa được sử