Sơ đồ chuyển trạng thái đẩy xuống (pushdown state transition diagram)

Một phần của tài liệu Giải quyết vấn đề nhận dạng tiếng Việt bằng phân tích cú pháp (Trang 41 - 45)

Sơ đồ chuyển trạng thái đẩy xuống là dạng đơn giản nhất của ô tô mát đẩy xuống thường được dùng trong các chương trình dịch. Về cơ bản, sơ đồ chuyển trạng thái đẩy xuống chỉ khác với sơ đồ chuyển trạng thái tuyến tính ở chỗ mỗi trạng thái có chứa một danh sách các phép đẩy xuống. Nhưng thuật toán sinh sơ đồ chuyển trạng thái đẩy xuống thì hoàn toàn khác.

2.5.1. Định nghĩa hình thức

Mỗi trạng thái trong sơ đồ chuyển trạng thái đẩy xuống có thêm một tập các phép dịch chuyển (reduce). Đây là khác biệt so với sơ đồ chuyển trạng thái tuyến tính. Chính nhờ đặc điểm này mà ngăn xếp hay đồ thị chuyển hình trạng của các bộ phân tích đẩy xuống có thể co lại (đẩy xuống) thay vì kéo dài mãi mãi như ngăn xếp của các bộ phân tích tuyến tính.

M = <V, Π, Q, i, F, δ, ρ>

V là từ điển đầy đủ của văn phạm tương ứng Π là tập các luật của văn phạm tương ứng Q là tập trạng thái của sơ đồ

F xác định các trạng thái kết thúc F⊂Q

δ là ánh xạ từ Σ×Q vào Q xác định các phép chuyển

ρ là ánh xạ từ Q vào Π xác định các phép rút gọn của mỗi trạng thái

Bảng 2-22. Định nghĩa hình thức sơđồ chuyển trạng thái đẩy xuống

Sơ đồ chuyển trạng thái đẩy xuống thường được sinh từ một văn phạm phi ngữ cảnh tương ứng. Ví dụ như sơ đồ dưới đây

0 (initial) 1 (final) 0 -> s 2 3 n -> t«i 4 n -> nã 5 s -> n vp 6 7 v -> ®i 8 v -> ra 9 vp -> v pl 10 pl -> chî 11 pl -> ch¬i s n t«i vp v ®i ra pl chî ch¬i * s = n vp; + n = tôi | ; vp = v pl; + v = đi | ra; + pl = chơi | chợ; Hình 2-2. Ví dụ về sơđồ chuyển trạng thái đẩy xuống

Trong sơ đồ này, chúng ta có thể thấy các câu của văn phạm được triển khai thế nào nếu như chúng ta đi từ trạng thái ban đầy 0 đến các trạng thái khác, ví dụ như câu “s”, hay câu “n v pl”, hay câu “n vp”. Chúng ta có thể thấy các khái niệm

V = { s, n, vp, v, pl, tôi, nó, đi, ra, chơi, chợ } Π = { s->n vp, n->tôi, n->, vp->v pl, v->đi, v->ra, pl->chơi, pl->chợ } Q = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 } i = 0 F = { 1 } ρ(0) = {} ρ(1) = { 0->s } ρ(2) = {} ρ(3) = { n->tôi } ρ(4) = { n->nó } ρ(5) = { s-> n vp } ρ(6) = { } ρ(7) = { v->đi } ρ(8) = { v->ra } ρ(9) = { vp-> v pl } ρ(10) = { pl->chợ } ρ(11) = { pl->chơi }

δ(0, s) = 1, δ(0, n) = 2, δ(0, tôi) = 3, δ(0, nó) = 4

δ(2, vp) = 5, δ(2, v) = 6, δ(2, đi) = 7, δ(2, ra) = 8,

δ(6, pl) = 9, δ(6, chợ) = 10, δ(6, chơi) = 11

Bảng 2-23. Ví dụ về sơđồ chuyển trạng thái đẩy xuống 2.5.2. Định nghĩa triển khai

Do mỗi sơ đồ chuyển trạng thái đẩy xuống tương ứng với một văn phạm và chứa một tập các luật cũng như tập ký hiệu, chúng tôi định nghĩa nó như là lớp con của lớp văn phạm.

struct pushdown_diagram_s: public grammar_s { longnat_t m_state_num;

pushdown_state_s **m_state; };

Bảng 2-24. Định nghĩa hình thức sơđồ chuyển trạng thái đẩy xuống

Mỗi trạng thái chứa danh sách các phép dịch chuyển (tương ứng với δ) và danh sách các phép rút gọn (tương ứng với ρ). Ngoài ra mỗi trạng thái cần chứa danh sách các mục (item). Danh sách này chỉ dùng duy nhất khi sinh các trạng thái và làm định danh cho chính trạng thái đó. Trạng thái đầu i và tập trạng thái kết thúc F sẽ được triển khai vào thành thuộc tính của một trạng thái.

struct pushdown_state_s { longnat_t m_id; bool_t m_final; bool_t m_initial; longnat_t m_reduce_num; pushdown_symbol_s **m_reduce_LHS; pushdown_rule_s **m_reduce_RHS; longnat_t m_shift_num; pushdown_state_s **m_shift_state; pushdown_state_s **m_shift_sym; longnat_t m_item_num;

pushdown_item_s **m_item; };

Bảng 2-25. Định nghĩa trạng thái đẩy xuống

Trong triển khai nhận dạng, chúng tôi đưa thêm từ điển mẫu cục bộ vào trong mỗi trạng thái đẩy xuống. Từ điển cục bộ này sẽ được dùng để nhận dạng tín hiệu vào tại trạng thái đó.

2.5.3. Thuật toán xây dựng

Việc xây dựng sơ đồ chuyển trạng thái đẩy xuống gồm hai bước. Bước thứ nhất là tải văn phạm tương ứng của nó lên từ tập tin và bước thứ hai là dùng thuật toán sinh. Chúng tôi sẽ trình bày thuật toán sinh

1) Sinh trạng thái đầu tiên, tính đầy đủ các item, và thêm vào sơ đồ 2) Với mỗi trạng thái s, ta sẽ sinh ra các trạng thái tiếp bằng các bước

21) Duyệt các item và sinh ra danh sách shift và danh sách reduce. Các item kết thúc sẽ được thêm vào danh sách reduce, các item còn ký tự thì ký tự được thêm vào shift 22) Với mỗi ký tự trong shift, sinh trạng thái ps, sưu tập các item từ s vào ps, tính đủ

item cho ps, và thêm ps vào sơ đồ nếu chưa có và xoá ps nếu đã có 3) Xoá bỏ tất cả các item trong sơ đồ, vì nó chỉ dùng khi sinh

Bảng 2-26a. Thuật toán xây dựng sơđồ chuyển trạng thái đẩy xuống

Thuật toán này khá phức tạp và cần một khái niệm trung gian là item, vốn là một luật có thêm con trỏ chỉ vị trí hiện tại (đang xét). Mỗi một trạng thái sẽ được xác định duy nhất bằng một danh sách các item. Phép xác định này cần thiết trong quá trình thêm duy nhất trạng thái vào sơ đồ.

pushdown_diagram_s::generate_diagram() {

pushdown_state_s *st = new pushdown_state_s();

st->add_item_unique(get_meta_symbol(), get_meta_rule()); st->calculate_other_items();

for(st ∈ this) {

st->generate_shift_list_and_reduce_list(); for(symbol sym ∈ st->shift_list) {

pst = new pushdown_state_s(); pst->collect_item_from(st, sym); pst->calculate_other_items(); nst = this->add_state_unique(st, sym, pst); if(nst != pst) delete pst; } } this->delete_all_items(); }

Bảng 2-26b. Thuật toán xây dựng sơđồ chuyển trạng thái đẩy xuống

Về cơ bản, việc sinh các trạng thái trong sơ đồ chuyển trạng thái đẩy xuống dựa vào các luật giống như việc sinh các trạng thái trong sơ đồ chuyển trạng thái tuyến tính dựa vào các câu. Do sơ đồ chuyển trạng thái tuyến tính dùng ngôn ngữ tuyến tính cho nên chúng ta không cần khái niệm item để lưu vị trí hiện tại.

Một phần của tài liệu Giải quyết vấn đề nhận dạng tiếng Việt bằng phân tích cú pháp (Trang 41 - 45)

Tải bản đầy đủ (PDF)

(107 trang)