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

Mô Tả Ngôn Ngữ Lập Trình Và Viết Chương Trình Xây Dựng Cây Phân Tích Cú Pháp

36 1,1K 2

Đ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 36
Dung lượng 1,14 MB

Nội dung

Việc nghiên cứu ngôn ngữ lập trình chúng ta có thể sử dụng tốt hơn nhiều khái niệm và những công cụ được phát trển trong thế kỷ này qua ngôn ngữ họclĩnh vực ngôn ngữ học nghiên cứu cả về

Trang 1

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG TRÌNH ĐÀO TẠO THẠC SĨ CNTT QUA MẠNG

-  -

Mô Tả Ngôn Ngữ Lập Trình Và Viết Chương Trình

Xây Dựng Cây Phân Tích Cú Pháp

Bộ môn : Nguyên Lý Ngôn Ngữ LT GVHD : TS Nguyễn Tuấn Đăng Thực hiện : Nguyễn Khánh Ngọc

CH1001117

Thành phố Hồ Chí Minh - Tháng 2 Năm 2012

Trang 2

NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN

Trang 3

MỤC LỤC

Phần 1: Tìm hiểu văn phạm và phân tích cú pháp

I Khái niệm ngôn ngữ lập trình 1

II Văn phạm và cú pháp 1

1 Văn phạm phi ngữ cảnh (Context-Free Grammar) 2

a BNF (Backus Naur normal form) 4

b Dẫn xuất và ngôn ngữ 5

c Cây dẫn xuất 6

d Sự mơ hồ (Ambiguity) 9

2 Ràng buộc cú pháp theo ngữ cảnh 11

III Trình Biên Dịch 12

1 Phân tích từ vựng (lexical analysis) 13

2 Phân tích cú pháp (syntax analysis) 14

3 Phân tích ngữ nghĩa (semantic analysis) 15

4 Phát sinh dạng trung gian (Generation of intermediate forms) 15

5 Tối ưu hóa mã lệnh (Code optimisation) 16

6 Sản sinh mã lệnh (Code generation) 16

IV Ngữ nghĩa 16

1 Trạng thái (State) 17

2 Quá trình chuyển đổi (Transition) 18

3 Ngữ nghĩa biểu thức (Expression semantics) 19

4 Ngữ nghĩa lệnh (Command semantics) 20

5 Tính Toán (Computations) 21

V Ngữ Dụng Và Cài Đặt 21

Trang 4

Phần 2: Xây Dựng Trình Phân Tích Cú Pháp

I Định nghĩa văn phạm 23

II Xây dựng trình phân tích cú pháp trong C # 24

1 Định nghĩa token và các phương thức làm việc trên token 24

2 Xây dựng trình phân tích cú pháp (parser) trong C # 24

3 Scanner 26

3 Hàm Main và chương trình minh họa 30

Tài liệu tham khảo 32

Trang 5

Phần I: Tìm hiểu văn phạm và trình phân tích cú pháp

I Khái niệm ngôn ngữ lập trình

Một ngôn ngữ lập trình là một dạng hình thức nhân tạo mà các thuật giải có thể được diễn đạt trên hình thức đó Việc nghiên cứu ngôn ngữ lập trình chúng ta có thể sử dụng tốt hơn nhiều khái niệm và những công cụ được phát trển trong thế kỷ này qua ngôn ngữ học(lĩnh vực ngôn ngữ học nghiên cứu cả về ngôn ngữ tự nhiên và ngôn ngữ nhân tạo) Không đi sâu vào chi tiết ngôn ngữ học, tiểu luận này đưa ra các vấn đề làm sao đê mô tả ngôn ngữ lập trình và công cụ nào được sử dụng để xây mô tả ngôn ngữ lập trình

Những cấp độ mô tả

Trong việc nghiên cứu ngôn ngữ học cổ điển, Morris đã nghiên cứu về các cập độ khác nhau để mô tả một ngôn ngữ Ông ta đã định nghĩa 3 cấp độ chính: grammar (ngữ pháp), semantic ( ngữ nghĩa) và pragmatics ( thực dụng )

 Grammar ( văn phạm ) là một phần trong việc mô tả ngôn ngữ, nó trả lời câu hỏi: cụm từ đã diễn đạt đúng chưa? Khi bảng ký tự (alphabet) của một ngôn ngữ được định nghĩa, thì thành phần từ vựng cấu thành từ một chuỗi có trình tự các ký hiệu của ngôn ngữ cũng được định nghĩa Khi bảng ký tự alphabet và từ vựng được định nghĩa, cú pháp (syntax) mô tả thứ tự của các từ cấu thành cụm

từ hợp lệ

 Semantics ( ngữ nghĩa ) là một phần của mô tả ngôn ngữ, nó trả lời câu hỏi:

“cụm từ đúng này nghĩa là gì?” Ngữ nghĩa để chỉ ý nghĩa của cụm từ Đối với ngôn ngữ tự nhiên, xử lý ngữ nghĩa rất phức tạp, trong khi đó đối với ngôn ngữ nhân tạo thi đơn giản hơn nhiều Trong trường hợp này ngữ nghĩa là mối quan

hệ giữa những câu đúng và ý nghĩa của chúng

 Pragmatics (Thực dụng) là một phần của mô tả ngôn ngữ, nó tự hỏi “Chúng ta

sử dụng một câu có ý nghĩa như thế nào?” Những câu có cũng ý nghĩa nhưng

có thể được sử dụng theo nhiều cách khác nhau tùy vào người sử dụng

 Trong trường hợp ngôn ngữ lập trình chúng ta có thể thêm 1 cấp độ thứ 4 là cấp

độ thực thi (implementation) Giả sử chúng ta quan tâm ngôn ngữ thủ tục hàm,

nó mô tả “Làm thế nào để thực thi một câu đúng theo ngữ nghĩa của câu”

Chúng ta xem xét ngôn ngữ tự nhiên đễ diễn tả một công thức nấu ăn Cú pháp diễn

tả những câu đúng dùng để diễn đạt công thức nấu ăn Ngữ nghĩa giải thích công thức nấu ăn đó là gì Pragmatic (thực dụng) mô tả người đầu bếp diễn dịch công thức đó như thế nào Và cuối cùng implementation ( thực thi) mô tả cách thực hiện các công thức nâu ăn, chuẩn bị chén đĩa thành các món ăn theo đúng những gì ngữ nghĩa muốn trình bày

Trang 6

II Văn phạm và cú pháp

Văn phạm (grammar) của một ngôn ngữ xây dựng bảng ký tự alphabet và từ vựng Sau đó cú pháp (syntax) định nghĩa những chuỗi ký tự đó theo những câu hoặc cụm từ

có định dạng chuẩn

Vào năm 1950 nhà ngôn ngữ học người Mỹ Noam Chomsky đã đưa ra một kỹ thuật

mô tả cú pháp, mô tả sử dụng những hình thức được thiết kế đặc biệt để giới hạn sự mơ

hồ trong ngôn ngữ tự nhiên Những kỹ thuật này gọi là ngữ pháp sản sinh, chúng không sử dụng nhiều trong việc mô tả ngôn ngữ tự nhiên ( bởi vì ngôn ngữ tự nhiên quá phức tạp ) mà nó dùng để mô tả cú pháp của ngôn ngữ lập trình

Ví dụ: chúng ta mô tả một ngôn ngữ đơn giản Đó là ngôn ngữ của những chuỗi đối xứng, được cấu thành bởi 2 ký tự là a và b Chúng ta có bảng ký tự (alphabet) như sau A={a,b}, bây giờ ta chọn ra các chuỗi câu thành từ các ký tự trong A, để tạo thành các chuỗi đối xứng Cách đơn giản nhất để thực hiện điều này, chú ý rằng có một sự đệ quy đơn giản của chuỗi đối xứng Chúng ta có thể phát biểu rằng a và b là chuỗi đối xứng, nếu s là đã là một chuỗi đối xứng thì asa và bsb cũng là chuỗi đối xứng

Các chuỗi đối xứng trên có chiều dài là số lẻ Nhưng chiều dài các chuỗi đối xứng cũng có thể là số chẵn, ví dụ abba Trong trường hợp này ta thêm một sư kiện là chuỗi rỗng (empty string) cũng là chuỗi đối xứng Như vậy một chuỗi được gọi la đối xứng (ví dụ: aabaa hoặc abba ), tồn tại một chuỗi các ký tự được ghép vào theo nguyên tắc quy nạp

Trang 7

quy nạp Ví dụ trên cho thấy văn phạm phi ngữ cảnh là công cụ cơ bản đê mô tả ngôn ngữ lập trình

Văn phạm phi ngữ cảnh là một công cụ cơ bản để mô tả ngôn ngữ lập trình Các ký hiệu và thuật ngữ trong văn phạm phi ngữ cảnh như sau Có một tập hữu hạn A, chúng

ta gọi là bảng chữ cái, và A* là tập tất cả các chuỗi hữu hạn trên A Chúng ta thấy rằng, thông qua định nghĩa này thì chuỗi rỗng cũng thuộc A* , ký hiệu là 𝜖

Một ngôn ngữ chính thức dựa và bảng chử cái A là tập con của A* Một văn phạm chính thức để nhận dạng một tập con của các chuỗi nào đó dựa trên bảng ký tự đã cho

Định nghĩa 2.1 (Context-Free Grammar):

Một văn phạm phi ngữ cảnh là một bộ tứ gồm (NT,T,R,S) Trong đó:

 NT là một tập hữu hạn các ký hiệu ( non-terminal symbols, variables, syntatic categories)

 T là một tập hữu hạn các ký hiệu (terminal symbols)

 R là một tập hữu hạn các luật, mỗi một luật được diễn đạt theo hình thức sau

𝑽 → 𝝎

V (vế trái của luật) là những ký hiệu non-terminal đơn giản, 𝜔 ( vế phải của luật ) là một chuỗi có thể là rỗng hoặc là terminal symbol hay non-terminal symbol (𝑇 ∪ 𝑁𝑇)

 S là một phần tử của NT, phần tử khởi tạo

Qua ví dụ này, và chuỗi đối xứng ta có văn phạm biễu diễn chuỗi đối xứng là bộ tứ gồm ({P},{a,b},R,P) với R là tập luật sau :

P →

P → a

Chúng ta thấy rằng một luật có thể có vế phải là rỗng, hoặc là ký hiệu null(chuoi64 rỗng ∈)

Ví dụ 1: Một ví dụ văn phạm đơn giản mô tả biểu thức toán học ( dựa trên các toán tử

+,*,-, cả toán tử một ngôi và hai ngôi ) Những phần tử nhỏ nhất của những biểu thức này là những định danh đơn giản được định dạng từ những chuỗi hữu hạn của các ký hiệu a và b

Trang 8

Chúng ta định nghĩa văn phạm 𝑮 = 𝑬, 𝑰 , 𝒂, 𝒃, +, −, , , 𝑹, 𝑬 , với R là tập luật sau

sử dụng các định nghĩa đệ quy

a BNF:

Trong ngữ cảnh ngôn ngữ lập trình, văn phạm phi ngữ cảnh được sủ dụng lần đầu tiên trong việc định nghĩa ngôn ngữ Algol60 Trong bài báo cáo giới thiệu về Algol60, văn phạm định nghĩa ngôn ngữ được mô tả bằng ký hiệu khác với các ví dụ mà chúng

ta đã xét ở trên, nó giảm đi tập ký tự, bỏ đi ký hiệu mũi tên ( -> ), những dấu ngoặc ( { , } ), chữ viết hoa văn phạm phi ngữ cảnh này có tên là “Backus Naur normal form” (BNF), đây là tên của 2 thành viên của tổ chức Algol (John Backus là người đã chỉ đạo

dự án Fortran, và đã viết trình biên dịch cho Fortran, và Peter Naur) Trong BNF: Một dẫn xuất của chuỗi ab*( a + b )

𝑬 ⟹𝟑 𝑬 ∗ 𝑬

⟹𝟏 𝑰 ∗ 𝑬

⟹𝟏𝟎 𝑰𝒃 ∗ 𝑬

⟹𝟕 𝒂𝒃 ∗ 𝑬

Trang 9

Ký hiệu non-terminal được viết giưa những dấu ngoặc đơn góc ( ví dụ < 𝐸𝑥𝑝 >) Những luật có vế trái giống nhau được nhóm thành khối đơn giản sử dụng ký hiệu

sử dụng luật (3) ta có 𝐸 ⟹3 𝐸 ∗ 𝐸 Bây giờ ta xét vế phải của luật, ta có được 𝐸 ∗ 𝐸,

mà 𝐸 ∗ 𝐸 ⟹1 𝐼 ∗ 𝐸 Chúng ta có thể tiếp tục khai triển I và E đến khi nào đạt được chuỗi dẫn xuất ab*(a+b)

Định nghĩa 2.2:

Giả sử có một văn phạm 𝑮 = 𝑵𝑻, 𝑻, 𝑹, 𝑺 , và đã gán 2 chuỗi

𝑣 𝑣à 𝜔 𝑙ầ𝑦 𝑡ừ 𝑡ậ𝑝 𝑁𝑇 ∪ 𝑇, chúng ta nói rằng 𝜔 được dẫn xuất trực tiếp từ 𝑣, nếu 𝜔 đạt

được từ 𝑣, trong trường hợp này chúng ta có thể viết là 𝑣 ⇒ 𝜔

Chúng ta nói rằng 𝜔 được dẫn xuất từ 𝑣, và chúng ta viết 𝑣 ⇒∗ 𝜔, nếu có tồn tại một chuỗi hữu hạn(có thể là chuỗi rỗng) của các dẫn xuất trực tiếp 𝑣 ⟹ 𝜔0 ⟹ 𝜔1 ⟹

𝜔2 ⟹ ⋯ ⟹ 𝜔

Sử dụng các ký hiệu và quy tắc trên, chúng ta có thể viết như sau

𝑬 ∗ 𝑬 ⇒∗ 𝒂𝒃 ∗ (𝒂 + 𝑰)

Định nghĩa 2.3 (Generated Language)

Ngôn ngữ được sản sinh bởi văn phạm 𝑮 = 𝑵𝑻, 𝑻, 𝑹, 𝑺 là một tập

𝓛 𝑮 = 𝝎 ∈ 𝑻∗ 𝑺 ⇒∗ 𝝎}

Trang 10

c Cây dẫn xuất:

Dẫn xuất của một chuỗi là quá trình xử lý tuần tự, có những bước phải được thực thi theo thứ tự chính xác Ví dụ trong văn phạm trên ⇒10 phải thực thi sau ⇒3bởi vì luật (10) viết lại ký hiệu I ( ký hiệu non-terminal), không tồn tại trong chuổi khởi tạo Hai dẫn xuất của chuỗi ab*(a+b) xây dựng lại cấu trúc của chuỗi theo cách giống nhau

Hình 1: Cây dẫn xuất của chuỗi ab*(a+b)

Mỗi một nút trong của cây được gán nhãn là một ký hiệu thuộc tập NT

Nếu một nút chính có nhãn 𝐴 ∈ 𝑁𝑇 và con của nó là 𝑚1, 𝑚2,…,𝑚𝑘 được gán nhãn lần lượt là 𝑋1, 𝑋2,…,𝑋𝑘với 𝑋𝑖 ∈ 𝑁𝑇 ∪ 𝑇, (𝑖 ∈ 1, 𝑘 , và 𝐴 → 𝑋1… 𝑋𝐾) là một luật của

R

Trang 11

Nếu một nút được gắn nhãn là 𝜖, thì nút đó là nốt con duy nhất Nếu A là cha của

nó thì 𝐴 → 𝜖 là một luật của R

Cây dẫn xuất có thể xây dựng từ các dẫn xuất Nó bắt đầu từ gốc và thêm vào một mức con liên quan đến luật sử dụng trong dân xuất Cây dẫn xuất là một trong những

kỹ thuật quan trọng nhất trong việc phân tích cú pháp ngôn ngữ lập trình

Cây: Khái niệm cây là một khái niệm quan trọng của ngành khoa học máy tính, được

sử dụng nhiều trong các ngôn ngữ chung ( như là cây phả hệ ) Một cây là một cấu trúc thông tin được định nghĩa theo nhiều cách khác nhau và nó tồn tại trong những lĩnh vực khác nhau Chúng ta chỉ quan tâm đên thứ cây thứ tự, và cây có gốc Một cây thứ

tự hay cây có gốc là một tập hữu hạn các nút, nếu cây đó không rỗng thì sẽ có một nút gọi là nút gốc, nếu tồn tại các nút con của nút gốc 𝑆1, 𝑆2, … , 𝑆𝑛, 𝑛 ≥ 0, mỗi 𝑆𝑖, 𝑖 ∈

[1, 𝑁] là một cây

Cây cho phép chúng ta nhóm các nút ở cùng mức lại với nhau, tại mức 0, chúng ta

có nút gốc, tại mức 1 chúng ta có các nút gốc của các cây 𝑆1, 𝑆2, … , 𝑆𝑛

Một cây cũng là trường hợp đặc biệt của đồ thị: một cây thứ tự (cây có gốc) là một cặp 𝑇 = 𝑁, 𝐴 , với N là một hữu hạn các nút và A là một các cung nối giữa 2 nút:

 Số lượng cung bằng hoặc ít hơn 1 cung so với tổng số nút

 T được gọi là liên thông nếu từ 1 nút có thể đi đến tất cả các nút khác (thông qua các cung)

 Một nút r được gọi là nút gốc thì nút gốc đó có mức 0, nếu một nút n tại mức i,

Trang 12

Hình 2: cây dẫn xuất của chuỗi a*b+a

Hình 3: cây dẫn xuất khác của chuỗi a*b+a

Hình 2, chúng ta thấy rằng biểu thức con a*b là con trái của cây Điều này cho t hấy chuỗi a*b+a phải được thông dịch là “a nhân b trước rồi lấy kết quả đó cộng với a”,

Trang 13

d Sự mơ hồ (Ambiguity): chúng ta hãy xem xét ví dụ sau

So sánh với Hình 2, ta thấy 2 cây có cấu trúc khác nhau nhưng cùng cho ra chết quả

là chuồi a*b+a Như vậy văn phạm chúng ta định nghĩa trên đã gây ra sự lầm lẫn, có thể tạo ra 2 cây khác nhau cùng biểu diễn cho cùng 1 chuỗi giống nhau

Định nghĩa 2.5:

 Cho 𝑇 = (𝑁, 𝐴) là một cây thứ tự, khác rỗng, có gốc là r Kết quả của quá trình duyệt cây từ trái sang phải là một mảng các nút đến đucợ bởi cách giải thuật đệ quy như sau:

 Nếu r không có con, kết quả của quá trình duyệt cây là r

Trang 14

 Nếu r có k con, 𝑚1, 𝑚2, , 𝑚𝑘, 𝑐ℎ𝑜 𝑇1, 𝑇2, , 𝑇𝑘là cây con của T với 𝑇𝑖 𝑐ó 𝑚𝑖là nút gốc của nó, kết quả của quá trình duyệt cây là các nút sẽ được duyệt theo thứ tự từ trái sang phải, 𝑇1 đế𝑛 𝑇𝑘

Ví dụ:

Chúng ta có văn phạm thông dịch cấu trúc của biểu thức theo khái niệm của độ ưu

tiên của các toán tử trong toán học Toán tử 1 ngôi (“-“) có độ ưu tiên cao nhất, sau đó

là *, và sau đó là toán tử +, - (có độ ưu tiên như nhau) Văn phạm sẽ phân tích, sau đó

một mảng các toán tử cùng cấp độ ưu tiên sẽ kết hợp với nhau bên phải Ví dụ a+b+a

sẽ được viết là a+(b+a) Khử sự mơ hồ bằng cách tăng độ phức tạp của chuỗi

Ví dụ sau cho thấy định nghĩa câu lệnh if trong văn phạm của ngôn ngữ java(nonterminal được in nghiêng, trong khi ký hiệu terminal trong ví dụ này là if, else

và những dấu ngoặc đơn)

if (expression1) if (expression2) command1;

else command2;

Java và hầu hết các ngôn ngữ lập trình khác cho phép câu lệnh điều kiện if có thế

có hoặc không có lệnh else theo sau.Văn phạm sau là văn phạm rõ ràng

Trang 15

Statement ::= | IfThenStatement | IfThenElseStatement |

StatementWithoutTrailingSubstatement StatementWithoutTrailingSubstatement ::= | Block | EmptyStatement | ReturnStatement

StatementNoShortIf ::= | StatementWithoutTrailingSubstatement |

IfThenElseStatementNoShortIf IfThenStatement ::= if ( Expression ) Statement

số , nó là cần thiết cho các chương trình có chứa việc khai báo của I và R trước khi gán Chương trình sẽ không chấp nhận việc gán nếu kiểu của biểu t hức R + 3 là không tương thích với biến I

Những chuỗi đúng với văn phạm và có thể hợp lệ chỉ trong một ngữ cảnh nào đó

Có nhiều ví dụ về ràng buộc cú pháp theo ngữ cảnh:

 Một định danh phải được khai báo trước khi sử dụng (Pascal, Java)

 Số lượng tham số truyền vào hàm phải bằng với những tham số chính thức (C, Pascal, Java …)

 Trong trường hợp phép gán, kiểu của biểu thức phải tương thích với kiểu của biến được gán (C, Pascal, Java, …)

 Việc gán giá trị cho biến điều khiển trong vòng lặp for là không hợp lệ trong(Pascal)

 Trước khi sử dụng biến, biến đó phải được gán trị (Java)

 Một phương thức có thể được định nghĩa lại bởi một phương thức cùng tên

Trang 16

Đây là những ràng buộc cú pháp Những ràng buộc này không thể được mô tả bằng văn phạm phi ngữ cảnh Như vậy sử dụng văn phạm nên tránh những mô tả cú pháp có ngữ cảnh, những ràng buộc ngữ cảnh này có thể diễn đạt bằng ngôn ngữ tự nhiên hoặc sử dụng các ký thuật hình thức như là những hệ thống chuyển đổi

Thuật ngữ Ràng buộc ngữ nghĩa tĩnh (static semantic constraint) được sử dụng trong ngôn ngữ lập trình để chỉ những hạn chế theo ngữ cảnh xuất hiện trong các khía cạnh cú pháp của một ngôn ngữ.Từ chuyên môn là "cú pháp" có nghĩa là "có thể mô tả

sử dụng một văn phạm phi ngữ cảnh", "ngữ nghĩa tĩnh" có nghĩa là "có thể mô tả những ràng buộc theo ngữ cảnh có thể kiểm tra được trên một cơ sở tĩnh bằng cách sử dụng các văn bản chương trình", trong khi “ngữ nghĩa động (dynamic semantic)" (hay đơn giản là "ngữ nghĩa-semantic") đề cập đến tất cả mọi thứ điều đó xảy ra khi một chương trình được thực hiện

Sự khác biệt giữa cú pháp phi ngữ cảnh và cú pháp phụ thuộc ngữ cảnh là ở ý nghĩa của văn phạm phi ngữ cảnh của bối cảnh Sự khác biệt giữa cú pháp và ngữ nghĩa là không phải lúc nào cũng rõ ràng.Một số trường hợp rõ ràng, ví dụ, chúng ta có một ngôn ngữ mà định nghĩa của nó nói rằng, khi có một phép chia cho 0 xảy ra trong quá trình thực thi, trình biên dịch phải báo cáo lỗi tường minh

Điều này rõ ràng là một ràng buộc ngữ nghĩa động Chúng ta giả định, hiện nay, định nghĩa của một ngôn ngữ khác được quy định như sau:

Một chương trình là sai cú pháp nếu phép chia cho 0 xảy ra

III Trình biên dịch (Compilers)

Trình biên dịch thực hiện các công việc sau:

1 Phân tích từ vựng (lexical analysis)

Mục đích của phân tích từ vựng là để đọc các biểu tượng (ký tự) hình thành các chương trình một cách tuần tự từ đầu vào và nhóm các biểu tượng này thành các nhóm

có ý nghĩa logic, chúng ta gọi là token (tương tự như từ vựng trong từ điển ngôn ngữ tự

Trang 17

nhiên Ví dụ bộ phân tích từ vựng của Java hay C, khi biểu diễn biểu thức x = 1 + foo++ ; sẽ có 7 token: định danh x, toán tử gán =, số 1, toán tử +, định dnah foo, và toán tử tăng 1 ++, và cuối cùng là dấu ;

Những token đặc biệt quan trọng là các từ dành riêng của ngôn ngữ (chẳng hạn như for, if, else …), các toán tử, ngoặc đơn mở và đóng (chẳng hạn như { và } trong C hoặc Java, và những những từ “begin”, “end” trong Pascal) Phân tích từ vựng là một quá trình đơn giản, nó quét văn bản đầu vào của chương trình nguồn từ trái sang phải, nhận

Trang 18

if A=0 then X := 0 else X := 1

hoặc trong chuỗi Java

if (A==0) X = 0; else X=1;

Như chúng ta đã biết, cây dẫn xuất hữu ích bởi vì nó thể hiện cấu trúc kinh điển của chuỗi Không phải tất cả các cây dẫn xuất đều tương ứng với các chương trình hợp lệ Chúng ta biết rằng phân tích ngữ nghĩa tĩnh có nhiệm vụ lựa chọn những cây đáp ứng các ràng buộc theo ngữ cảnh của ngôn ngữ Tập hợp các cây kết quả từ quá trình này tạo nên cú pháp trừu tượng của ngôn ngữ

không giống như trường hợp của các từ vựng của ngôn ngữ tự nhiên, từ vựng cho các ngôn ngữ lập trình có thể được hình thành từ một tập hợp vô hạn các từ và có thể

là một danh sách đơn giản, vì vậy được sử dụng trong một từ điển thông thường là không đủ (ví dụ, về khả năng xác định định danh như dãy các ký tự có độ dài tùy ý bắt đầu với một ký tự đặc biệt)

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

Khi đã xây dựng xong danh sách các token, bộ phân tích cú pháp tìm cách xây dựng một cây dẫn xuất cho danh sách này Đây là một cây dẫn xuất trong văn phạm của ngôn ngữ Mỗi nút lá của cây này phải tương ứng với một token trong danh sách token đã xây dựng Hơn nữa, các nút lá này, đọc từ trái sang phải sẽ hình thành một cụm từ chính xác (hoặc một chuỗi các ký hiệu terminal) trong ngôn ngữ Chúng ta đã biết rằng cây dẫn xuất này mô tả cấu trúc logic của chương trình sẽ được sử dụng bởi các giai đoạn kế tiếp của quá trình biên dịch

Cũng có thể xảy ra trường hợp bộ phân tích cú pháp không thể xây dựng được cây dẫn xuất Điều này xảy ra khi các chuỗi đầu vào là không đúng với văn phạm của ngôn ngữ

Trong trường hợp này, bộ phân tích cú pháp báo cáo các lỗi đã gặp và quá trình biên dịch sẽ bỏ qua Trong thực tế, phân tích từ vựng và cú pháp được thực hiện xen kẽ (đặc biệt là hai giai đoạn không tuần tự nhưng bộ phân tích tạo ra một token cho từng lời gọi của bộ phân tích cú pháp

Văn phạm phổ biến (Regular Grammars)

Sự khác nhau giữa phân tích từ vựng và phân tích cú pháp có thể được xác định chính xác bằng cách sử dụng một phân loại chính thức của văn phạm Nếu văn phạm

có tất cả các luật có dạng 𝐴 → 𝑏𝐵 (hoặc theo hình thức 𝐴 → 𝐵𝑏), khi đó A và B là ký hiệu non-terminal (B cũng có thể là rỗng hoặc trùng với A) và b là một ký hiệu

Ngày đăng: 30/12/2015, 18:36

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

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

TÀI LIỆU LIÊN QUAN

w