1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Nhập môn Chương trình dịch - Bài 2 potx

19 348 2
Tài liệu đã được kiểm tra trùng lặp

Đ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 19
Dung lượng 150,06 KB

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

Nội dung

Nhập môn Chương trình dịchBài 2: Phân tích từ vựng... Nội dung chính Mô tả các bước chính của chương trình dịch  Phân tích từ vựng là gì?.  Viết một chương trình phân tích từ vựng  M

Trang 1

Nhập môn Chương trình dịch

Bài 2: Phân tích từ vựng

Trang 2

Nội dung chính

 Mô tả các bước chính của chương trình dịch

 Phân tích từ vựng là gì?

 Viết một chương trình phân tích từ vựng

 Mô tả từ tố - biểu thức chính quy (REs)

 Viết một chương trình sinh ra chương trình phân tích từ vựng

 Chuyển đổi REs – NFAs

 Chuyển đổi NFAs – DFAs

 Bài tập về nhà 1

Trang 3

Mô tả các bước dịch (1)

Mã nguồn (dãy các kí tự)

If (a == 0) min = a; Phân tích từ vựng

Phân tích cú pháp

Phân tích ngữ nghĩa

Dãy các từ tố (token)

Cây cú pháp

Cây cú pháp điều khiển

; Id:a

= Id:min )

0

==

Id:a (

If

if

a 0 min a

if

a 0 min a

int int int

lvalue

int int boolean

Trang 4

Phân tích từ vựng

Mã nguồn (dãy các kí tự)

If (a == 0) min = a; Phân tích từ vựng

Phân tích cú pháp

Phân tích ngữ nghĩa

Dãy các từ tố (token)

; Id:a

= Id:min )

0

==

Id:a (

If

(lexical analysis)

Trang 5

Từ tố (token)

Tên: x, y11, elsex, _i00

Từ khóa: if, else, while, break

Số nguyên: 2, 1000, -500, 5L

Số thực: 2.0, 0.00020, 02, 1.1e5, 0.e-10

Kí hiệu: +, *, {, }, ++, <, <<, [, ], >=

Xâu kí tự: “x”, “He said, \“Are you?\””

Ghi chú: /** don’t change this **/

Trang 6

Phân tích từ vựng kiểu AD-HOC

 Tự viết mã lệnh để sinh ra các từ tố

 Ví dụ: Đoạn chương trình nhận dạng từ tố loại “Tên”

Token readIdentifier( ) {

String id = “”;

while (true) {

char c = input.read();

if (!identifierChar(c))

return new Token(ID, id, lineNumber);

id = id + String(c);

}

}

Trang 7

Nhìn trước 1 kí tự

Duyệt chương trình nguồn từng kí tự một

– Sử dụng kí tự nhìn trước để quyết định loại từ

tố và vị trí kết thúc từ tố

char next;

while (identifierChar(next)) {

id = id + String(next);

next = input.read ();

}

x e

s l e

^

next

Trang 8

Vòng lặp chính

 Hàm nextToken

Token nextToken( ) {

if (identifierFirstChar(next))

return readIdentifier();

if (numericChar(next))

return readNumber();

if (next == ‘\”’) return readStringConst();

}

Trang 9

Các vấn đề của phương pháp

AD-HOC

 Trong một số trường hợp, không thể biết loại từ

tố qua kí tự đọc vào đầu tiên

– Nếu kí tự đầu tiên là “i”, đó có thể là tên hoặc từ khóa

“if”

– Nếu kí tự đầu tiên là “2”, đó có thể là số nguyên hoặc

số thực

– Mã lệnh kiểu AD-HOC khó viết đúng, và bảo trì nó

còn khó hơn nhiều

 Vì vậy, cần một cách tiếp cận mới, có nguyên

tắc hơn: các chương trình sinh ra các chương trình phân tích từ vựng một cách tự động (ví dụ: lex, JLex)

Trang 10

Các vấn đề nảy sinh

 Cần cách mô tả các từ tố không bị nhập nhằng

– 2.e0 20.e-01 2.0000

– “” “x” “\\” “\”\’”

 Cần một phương pháp để tách chuỗi kí tự thành các từ tố

if (x == 0) a = x<<1;

iff (x == 0) a = x<1;

 Phương pháp này phải hiệu quả

– Phân biệt các từ tố có chung đoạn kí tự đầu

– Chỉ cần nhìn trước 1 kí tự

Trang 11

Mô tả từ tố

 Từ tố trong các ngôn ngữ lập trình có thể mô tả bằng các biểu thức chính quy (REs)

 Mỗi biểu thức chính quy R có thể biểu diễn một tập các xâu kí tự L(R)

 L(R) gọi là “ngôn ngữ” định nghĩa bởi R

 Ví dụ

– L(abc) = { abc }

– L(hello|goodbye) = {hello, goodbye}

– L([1-9][0-9]*) = tập các hằng số nguyên dương

 Ý tưởng: mô tả mỗi loại từ tố bằng một biểu

thức chính quy

Trang 12

Quy ước của REs

L(a) = {a} – tập hợp gồm xâu “a”

L(ε) = {ε} – tập hợp gồm xâu rỗng

L(R|S) = L(R)  L(S) – hợp của L(R) và L(S) L(RS) = {xy | x  L(R), y  L(S)} – nối 2 xâu

bất kì của L(R) và L(S) L(R*) = L(ε|R|RR|RRR|RRRR …) – nối các xâu của L(R) lại với nhau

a

ε

R|S

RS

R*

Trang 13

Một số quy ước khác

L(R+) = L(R*) \ {ε} – R* loại bỏ xâu rỗng L(R?) = L(R|ε)

L([abcd]) = L(a|b|c|d) L([a-z]) = L(a|b| |z) L([^abc]) = kí tự bất kì không thuộc L([abc]) L([^a-z]) = kí tự bất kì không thuộc L([a-z])

R+

R?

[abcd]

[a-z]

[^abc]

[^a-z]

Trang 14

Ví dụ

“a”

“ab”

“a”, “b”

“”, “ab”, “abab” …

“ab”, “b”

a

ab

a | b

(ab)*

(a | ε) b

Xâu thuộc ngôn ngữ Biểu thức chính quy (RE)

Trang 15

Ví dụ

“0”, “2”, “9”

“123”, “5678”

“123”, “-5678”

“123”, “-5678.123”

“min”, “cal_Max1”

digit = [0-9]

posint = digit+

int = -? posint

real = int (ε | ( posint))

= -?9]+(ε | ( [0-9]+))

id = [a-zA-Z_][a-zA-Z0-9_]*

Xâu thuộc ngôn ngữ Biểu thức chính quy (RE)

Trang 16

Tách từ tố từ chuỗi kí tự

2 elsex = 0 ;

 REs là chưa đủ để chỉ ra cách tách các từ tố

 Đa số các ngôn ngữ sử dụng luật “dài nhất

thắng”: RE cho xâu dài nhất có thể được sẽ

được chọn

 Khi RE cho các xâu dài bằng nhau, từ tố được

ưu tiên hơn sẽ được chọn

 Đặc tả chương trình PTTV = REs + luật “dài nhất thắng” + mức độ ưu tiên

Trang 17

Đặc tả chương trình PTTV

 Là đầu vào cho các chương trình sinh ra

chương trình phân tích từ vựng

– Danh sách REs theo thứ tự ưu tiên

– Hành động gắn liền với mỗi RE khi chương trình

PTTV nhận dạng được một từ tố bằng RE đó

 Đầu ra của các chương trình này là một chương

trình PTTV có thể

– Đọc chương trình nguồn và tách nó ra thành các từ tố bằng cách nhận dạng REs

– Thông báo lỗi nếu gặp phải kí tự không đúng theo

REs

Trang 18

Example: Lex

%%

digits = 0|[1-9][0-9]*

letter = [A-Za-z]

identifier = {letter}({letter}|[0-9_])*

whitespace = [\ \t\n\r]+

%%

{whitespace} {/* discard */}

{digits} { return new

IntegerConstant(Integer.parseInt(yytext()); }

“if” { return new IfToken(); }

“while” { return new WhileToken(); }

{identifier} { return new IdentifierToken(yytext()); }

Trang 19

Tổng kết

 Chương trình PTTV chuyển chương trình nguồn thành dãy các từ tố (token)

 PTTV kiểu AD-HOC khó viết đúng, khó bảo trì

 Có thể mô tả chính xác các từ tố trong các ngôn ngữ lập trình bằng biểu thức chính quy (RE)

 Đầu vào của chương trình sinh ra chương trình PTTV là đặc tả của chương trình PTTV: REs, mức độ ưu tiên và các hành động tương ứng

 Bài tới: hoạt động của các chương trình sinh ra chương trình PTTV

Ngày đăng: 24/07/2014, 08:21

TỪ KHÓA LIÊN QUAN