1. Trang chủ
  2. » Thể loại khác

Nghiên cứu tổng quan về chương trình dịch : Luận văn ThS. Toán học: 60 46 35

60 23 0

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

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 60
Dung lượng 1,11 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 2

2

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 4

4

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 5

5

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 6

6

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 7

7

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 8

8

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 9

9

đượ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 10

10

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 11

11

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 12

12

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 13

13

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 14

14

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 15

15

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 17

17

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 18

18

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ử rslà 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 19

19

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 20

20

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 21

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

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 22

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)   (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 23

23

 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 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 kX 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)

 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 j1

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 26

2.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 27

27

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ápij (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 Ax 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  BCk,

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 29

Bướ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 30

Việ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ử

Ngày đăng: 15/09/2020, 14:46

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w