Bài giảng Chương trình dịch: Bài 4 - Trương Xuân Nam

20 12 0
Bài giảng Chương trình dịch: Bài 4 - Trương Xuân Nam

Đ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

 Từ trạng thái bắt đầu, dựa trên kí tự đầu vào biến đổi trạng thái, quá trình này kết thúc khi đến trạng thái dừng.  Trạng thái dừng sẽ quyết định từ loại mà FA đoán nhận được (bao g[r]

(1)

CHƯƠNG TRÌNH DỊCH

(2)

1. Bộ phân tích từ vựng cho ngơn ngữ A 2. Automat hữu hạn (FA)

1. Đồ thị chuyển (TD)

2. Automat hữu hạn không đơn định (NFA) 3. Automat hữu hạn đơn định (DFA)

3. Chuyển đổi biểu thức quy sang DFA

1. Chuyển đổi từ biểu thức quy sang NFA 2. Chuyển đổi từ NFA sang DFA

3. DFA tối ưu cho phân tích từ vựng

4. Bộ phân tích từ vựng dựa DFA

(3)

Bộ phân tích từ vựng cho ngơn ngữ A

(4)

Viết PTTV cho ngôn ngữ lập trình đơn giản giúp người sử dụng thực phép toán số

1. Mỗi lệnh viết dịng

2. Lệnh có dạng <biến> = <biểu thức>

3. <biến> tên riêng, không cần khai báo trước, giống quy cách tên biến thông dụng, biến số

4. <biểu thức> theo quy cách biểu thức số học, gồm

Số nguyên, số thực, biến

(5)

Bộ PTTV đơn giản (mã giả C#)

// chứa thông tin từ tố

class Word {

public int wordType; // chứa từ loại từ

public string wordContent; // chứa nội dung từ

}

// phân tích từ vựng

class PTTV {

// phân tích chuỗi S thành dãy từ tố

public List<Word> process(string S) { … }

// lấy từ tố

(6)

using System;

using System.Collections.Generic;

// định nghĩa từ loại PTTV

enum WordType {

TYPE_EOF, // loại kết thúc đầu vào

TYPE_ERROR, // loại đầu vào lỗi

TYPE_SPACE, // dấu trống, tab,

TYPE_VAR, // tên biến

TYPE_INTEGER, // số nguyên

TYPE_OPERATOR, // phép toán

(7)

Bộ PTTV cho ngôn ngữ A

// lớp chứa thông tin từ

class Word {

public WordType wordType; // chứa từ loại từ

public string wordContent; // chứa nội dung từ

public Word(WordType t, string c) { wordType = t; wordContent = c; }

}

// lớp automata thực PTTV

class PTTV {

(8)

public List<Word> process(string a) { List<Word> list = new List<Word>(); pos = 0;

do {

Word x = getNextWord(); list.Add(x);

if (x.wordType == WordType.TYPE_EOF) break; if (x.wordType == WordType.TYPE_ERROR) break; pos += x.wordContent.Length;

(9)

Bộ PTTV cho ngôn ngữ A

// lấy từ

Word getNextWord() {

Word x = new Word(WordType.TYPE_EOF, ""); if (pos >= input.Length) return x;

x = nextIsSpace();

if (x != null) return x; x = nextIsOperator(); if (x != null) return x;

x = new Word(WordType.TYPE_ERROR, ""); return x;

(10)

// từ có phải kí hiệu trống, tab, ?

Word nextIsSpace() {

if (input[pos]==' ') return new Word(WordType.TYPE_SPACE, " ");

return null; }

// từ có phải kí hiệu phép tốn?

Word nextIsOperator() {

if ((input[pos]=='+') || (input[pos]=='-') ||

(input[pos]=='*') || (input[pos]=='/') || (input[pos]=='%'))

return new Word(WordType.TYPE_OPERATOR, "" + input[pos]);

(11)

Bộ PTTV cho ngôn ngữ A

// hàm thử nghiệm PTTV

class MyApp {

public static void Main() { PTTV scanner = new PTTV();

List<Word> x = scanner.process("=+1"); foreach (Word w in x)

Console.WriteLine("{0}: {1}", w.wordType, w.wordContent); }

(12)

Automat hữu hạn (FA)

(13)

Automat hữu hạn (FA)

 Nhận xét PTTV đơn giản phần trước:

 Cấu trúc chương trình đơn giản, dễ hiểu

 Dễ mở rộng bổ sung từ loại mới

 Hoạt động chậm, từ loại thử đoán nhận lần; trường hợp tệ (có lỗi) có độ phức tạp cao phải thử tất từ loại

(14)

 Automat hữu hạn (finite-state automaton) dùng để đoán nhận lớp ngơn ngữ quy (regular expression)

 Cấu trúc học FA gồm:

 Bảng chuyển

 Đầu đọc

 Xâu vào

 Quá trình hoạt động:

 Bắt đầu từ trạng thái xuất phát

 Đọc từ kí tự từ xâu vào

 Quan sát bảng chuyển để biết chuyển sang trạng thái nào Automat

hữu hạn Xâu

o

Bảng

(15)

Automat hữu hạn (FA)

 Hoạt động automat hữu hạn đơn giản:

 Mỗi bước đọc kí tự từ đầu vào

 Từ trạng thái bắt đầu, dựa kí tự đầu vào biến đổi trạng thái, trình kết thúc đến trạng thái dừng

 Trạng thái dừng định từ loại mà FA đoán nhận được (bao gồm lỗi)

 Dễ thấy độ phức tạp tính tốn thuật tốn đốn nhận tuyến tính theo độ dài liệu đầu vào (vì bước chuyển nhận kí tự đầu vào)

 Vấn đề automat hữu hạn: làm xây

(16)

 Automat hữu hạn chia làm loại:

 Automat hữu hạn đơn định (deterministic finite automata – DFA)

• Với kí hiệu đầu vào, chuyển sang tối đa trạng thái thái (hoặc dừng báo lỗi)

• Khơng chấp nhận kí hiệu đầu vào 

 Automat hữu hạn không đơn định (non-deterministic finite automata – NFA)

• Chấp nhận kí hiệu đầu vào 

• Với kí hiệu đầu vào, chuyển sang nhiều trạng thái tiếp theo

(17)

Đồ thị chuyển (TD - transition diagram)

(18)

Đồ thị chuyển biểu diễn tên

Đồ thị chuyển phương pháp thường sử dụng để mô tả cách trực quan sơ đồ hoạt động

automat hữu hạn

Đồ thị chuyển biểu diễn loại số thực

(19)

Các kí hiệu đồ thị chuyển

 Trạng thái: vẽ vòng tròn, kí hiệu ghi bên là “tên” (số hiệu) trạng thái đó

 Trạng thái kết thúc: vịng trịn kép

 Trạng thái kết thúc có đánh dấu (*): ký tự cuối không thuộc vào từ tố đoán nhận

 Bước chuyển: vẽ mũi tên nối tới trạng thái chuyển đến, kí hiệu ghi bên cạnh “nhãn” bước chuyển

 Nhãn ghi các kí tự hoặc loại kí tự cho phép thực bước chuyển

(20)

Xét ngơn ngữ quy L = aa* | b | ab

Ta xây dựng đồ thị chuyển nhận biết L có đặc trưng NFA:

 Từ trạng thái có nhiều bước chuyển tương tự

 Chứa kí hiệu  ở nhãn

Ngày đăng: 31/03/2021, 23:21

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan