1 / 36

BÀI GIẢNG CHƯƠNG TRÌNH DỊCH

BÀI GIẢNG CHƯƠNG TRÌNH DỊCH. Bộ môn khoa học máy tính. Chương 2: Phân tích từ vựng. Nhiệm vụ Biểu diễn từ tố Viết chương trình phân tích từ vựng Kiểm lỗi. 1. Nhiệm vụ. 1. Nhiệm vụ. Nhiệm vụ của phân tích từ vựng (PTTV): Đọc chương trình nguồn, loại bỏ các kí hiệu vô ích

Download Presentation

BÀI GIẢNG CHƯƠNG TRÌNH DỊCH

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. BÀI GIẢNGCHƯƠNG TRÌNH DỊCH Bộ môn khoa học máy tính

  2. Chương 2: Phân tích từ vựng • Nhiệm vụ • Biểu diễn từ tố • Viết chương trình phân tích từ vựng • Kiểm lỗi

  3. 1. Nhiệm vụ

  4. 1. Nhiệm vụ • Nhiệm vụ của phân tích từ vựng (PTTV): • Đọc chương trình nguồn, loại bỏ các kí hiệu vô ích • Xác định từ vựng, phân loại từ vựng vào một loại từ tố, cung cấp từ tố cho pha phân tích cú pháp • Đưa ra một số thông tin thuộc tính của từ vựng.

  5. 1. Nhiệm vụ • Từ vựng là một đơn vị nhỏ nhất trong một ngôn ngữ lập trình. • PTTV nhóm các ký tự trong chương trình nguồn theo một quy ước (luật) nào đó tạo thành một từ vựng. • PTTV lưu thông tin về số dòng, số cột giúp cho việc thông báo vị trí phát hiện lỗi.

  6. 1. Nhiệm vụ • Một số loại từ tố thường gặp cho các NNLT: • Từ khóa • Tên do người sử dụng đặt • Số • Xâu kí tự • Các toán tử • Các kí hiệu đặc biệt

  7. 2. Biểu diễn từ tố • Mỗi từ tố có một luật để mô nhằm phân biệt các loại từ tố với nhau. •  Cần biểu diễn luật rõ ràng, không nhập nhằng •  Sử dụng biểu thức chính quy hoặc đồ thị chuyển

  8. 2.a. Biểu diễn từ tố bằng biểu thức chính quy • Các ký hiệu qui ước: Ký hiệu Ý nghĩa | hoặc () nhóm các thành phần * lặp đi lặp lại không hoặc nhiều lần + lặp lại 1 hoặc nhiều lần ? lặp lại không hoặc một lần

  9. 2.a. Biểu diễn từ tố bằng biểu thức chính quy • Mô tả bằng lời các luật biểu diễn các từ tố sau: • Chữ cái là các chữ cái in hoa, in thường trong bảng chữ cái tiếng anh • Chữ số là các chữ số trong hệ thập phân • Tên: một xâu ký tự, bắt đầu bằng chữ cái, có thể có chữ cái hoặc chữ số theo sau

  10. 2.a. Biểu diễn từ tố bằng biểu thức chính quy • Mô tả bằng lời các luật biểu diễn các từ tố sau: • Số nguyên: một dãy các chữ số • Số thực: có hai phần phần nguyên và phần thực được phân cách nhau bởi một dấu chấm. Mỗi phần chỉ gồm các chữ số • Toán tử quan hệ: <, >, =, <=, >=, <>

  11. 2.a. Biểu diễn từ tố bằng biểu thức chính quy • Mô tả các từ tố trên bằng biểu thức chính quy sau: • Chữ cái  A | B | … | Z | a | b | … | z • Chữ số  0 | 1 | … | 9 • Tên  Chữ cái (chữ cái | chữ số)* • Số nguyên  (chữ số)+ • Quan hệ  < | <= | = | < > | > | >= • Số thực  (chữ số)+ .(chữ số)+

  12. 2.b. Đồ thị chuyển • Qui ước trong đồ thị chuyển: • Đỉnh: các vòng tròn biểu diễn cho các trạng thái, ký tự ghi bên trong vòng tròn là ký hiệu cho trạng thái đó. • Trạng thái kết thúc biểu diễn bằng một vòng tròn kép. • Nếu trạng thái kết thúc có thêm dấu *, tức là ký tự cuối cùng không thuộc vào xâu ký tự đang xét

  13. 2.b. Đồ thị chuyển • Qui ước trong đồ thị chuyển: • Các cạnh có hướng nối các đỉnh. Tên của cạnh là một ký tự đang xét. • Nhãn khác chỉ mọi kí hiệu khác các kí hiệu có trên các cạnh đi ra từ trạng thái q. • Nhãn start là đi vào trạng thái bắt đầu.

  14. 2.b. Đồ thị chuyển • Đồ thị chuyển biểu diễn từ tố tên • Đồ thị chuyển biểu diễn từ tố số nguyên

  15. 2.b. Đồ thị chuyển • Đồ thị chuyển biểu diễn số thực

  16. 2.b. Đồ thị chuyển • Đồ thị chuyển biểu diễn toán tử quan hệ

  17. Kết hợp 4 đồ thị thành 1 đồ thị chuyển

  18. 3. Viết chương trình phân tích từ vựng • Viết chương trình phân tích từ vựng theo 2 cách: • Diễn giải đồ thị chuyển • Tra bảng chuyển trạng thái

  19. 3.1. Diễn giải đồ thị chuyển • State: biến lưu trạng thái • Blank, newline, tab: hằng của dấu cách, xuống dòng, tab • Isalpha(c): hàm kiểm tra c có là chữ cái không • Isnumber(c): hàm kiểm tra c có là chữ số không • Nextchar : hàm trả về một ký tự tiếp đọc được • Install_num: thủ tục xử lý khi đọc được 1 số

  20. 3.1. Diễn giải đồ thị chuyển • Install_id: thủ tục xử lý khi đọc được 1 tên. • Kiểm tra xem tên có trùng với từ khóa nào không • Nếu không là từ khóa thì thêm vào bảng ký hiệu • Nếu trùng với tên nào đó trong bảng ký hiệu thì báo lỗi • Retract(): thủ tục lùi lại một ký tự trên chương trình nguồn • NextToken: hàm trả về một từ tố

  21. 3.1. Diễn giải đồ thị chuyển • Type Token = {ten, nguyen, thuc, LE, NE, LT, EQ, GE, GT, LOI} • Var state : byte; • Function NextToken : Token; • Var exitflag : boolean; • Begin • Exitflag := false; State := 0; • Repeat • Case state of • 0: begin End; • 1: • ……{Xử lý các trạng thái ở đây} • End; {case} • Until exitflag; • End;

  22. 3.1. Diễn giải đồ thị chuyển • Case state of • 0: begin • c := nextchar; • case c of • blank, tab, newline: state := 0; • ‘<’ : state := 1; • ‘=’ : state := 5; • ‘>’ : state := 6; • end; • if isalpha(c) then state := 14 • else if isnumber(c) then state := 9 • else Begin exitflag := true; NextToken := LOI; end; • End;

  23. 3.1. Diễn giải đồ thị chuyển • Case state of • 1: Begin • c := nextchar; • case c of • ‘=’ : state := 2; • ‘>’ : state := 3; • End else state := 4; • End; • 2: Begin • NextToken := LE; exitflag := true; • End;

  24. 3.1. Diễn giải đồ thị chuyển • Case state of • 3: Begin • NextToken := NE; exitflag := true; • End; • 4: Begin • retract(1); NextToken := LT; exitflag := true; • End; • 5: begin • NextToken := EQ; exitflag := true; • End;

  25. 3.1. Diễn giải đồ thị chuyển • Case state of • 10: Begin • Retract(1); install_num(); NextToken := nguyen; exitflag := true; • End; • 11: Begin • c := nextchar; • if isnumber(c) then state := 12 else • Begin • NextToken := LOI; exitflag := true; • End; • End;

  26. 3.1. Diễn giải đồ thị chuyển • Case state of • 13: Begin • Retract(1); install_num(); NextToken := Thuc; • exitflag := true; • End; • 14: Begin • c := nextchar; • if isnumber(c) or isalpha(c) then state := 14 • else state := 15; • End; • 15: Begin • Retract(1); install_id(); NextToken := ten; exitflag := true; • End;

  27. 3.1. Diễn giải đồ thị chuyển • Ưu điểm: dễ hiểu, dễ viết vì rất trực quan. • Nhược điểm: • Do đã gắn kết cấu đồ thị chuyển vào trong chương trình. Khi thay đổi đồ thị chuyển thì phải viết lại chương trình. •  Do đó, khó bảo trì.

  28. 3.2. Tra bảng chuyển trạng thái • Xây dựng một bảng chuyển trạng thái: • Số dòng là số trạng thái không kết thúc • Số cột là số các nhãn cạnh khác nhau • Tại ô có dòng tương ứng với trạng thái q, cột tương ứng với ký tự c: ta ghi trạng thái tiếp theo trên đồ thị chuyển khi đang ở trạng thái q mà gặp ký tự c.

  29. 3.2. Tra bảng chuyển trạng thái • Với đồ thị chuyển cho từ tố tên, số nguyên, số thực, toán tử so sánh ở trên: • Các dòng tương ứng với trạng thái: 0, 1, 6, 9, 11, 12, 14 • Các cột tương ứng với: chữ số, chữ cái, < , > , = , . , khác

  30. 3.2. Tra bảng chuyển trạng thái • Bảng trạng thái (20 là trạng thái lỗi)

  31. 3.2. Tra bảng chuyển trạng thái • Const Bang = array[1..7, 1..7] of integer = (…); • Type Token = {ten, nguyen, thuc, LE, NE, LT, EQ, GE, GT, LOI} • Function NextToken : Token; • Var state : byte; • Begin • State := 0; • Repeat • c := nextchar; • state := bang[state, LoaiKiTu(c)]; • until state in [2, 3, 4, 5, 7, 8, 10, 13, 15, 20]; • {Xử lý các trạng thái kết thúc ở đây} • End;

  32. 3.2. Tra bảng chuyển trạng thái • Xử lý các trạng thái kết thúc: • Case state of • 2: NextToken := LE; • 3: NextToken := NE; • 4: Begin retract(1); NextToken := LT; End; • 5: NextToken := EQ; • 7: NextToken := GE; • 8: Begin retract(1); NextToken := GT; End; • 10: Begin retract(1); install_num(); NextToken := nguyen; end; • 13: Begin retract(1); install_num(); NextToken := thuc; end; • 15: Begin retract(1); install_id(); NextToken := ten; end; • End else Begin retract(1); NextToken := LOI; end;

  33. 3.2. Tra bảng chuyển trạng thái • Ưu điểm: tách độc lập đồ thị chuyển với chương trình do đó dễ sửa chữa bảo trì. • Nhược điểm: khó lập bảng, kích thước bảng lớn, không trực quan.

  34. 4. Kiểm lỗi • Bộ phân tích từ vựng sẽ phát hiện ra những lỗi sai về từ vựng không đúng. • Số lỗi này ít vì bộ phân tích từ vựng chỉ quan sát chương trình nguồn một cách cụ bộ, không xét đến quan hệ cấu trúc các từ vựng với nhau. • Khi gặp lỗi này, cách xử lý đơn giản nhất là hệ thống sẽ ngừng hoạt động và báo lỗi cho người sử dụng.

  35. 4. Kiểm lỗi • Cách xử lý tốt hơn và hiệu quả hơn là bộ phân tích từ vựng sẽ ghi lại các lỗi này và cố gắng bỏ qua chúng để hệ thống có thể tiếp tục làm việc, nhằm phát hiệu đồng thời thêm nhiều lỗi nữa. • Các cách khắc phục có thể: • Xóa hoặc nhẩy qua các kí tự mà không tìm được từ tố • Thêm một kí tự bị thiếu • Thay một kí tự sai bằng một kí tự đúng • Đổi hai kí tự đứng cạnh nhau

  36. Các bước xây dựng một bộ phân tích từ vựng • Sưu tầm tất cả các luật từ vựng, các luật này thường được mô tả bằng lời • Vẽ đồ thị chuyển cho từng luật một. • Kết hợp các đồ thị chuyển này thành một đồ thị chuyển duy nhất • Viết chương trình dựa trên đồ thị chuyển. • Thêm phần báo lỗi để thành bộ phân tích từ vựng hoàn chỉnh

More Related