Cho đầy đủ bảng ACTION và bảng GOTO đã được xây dựng sẵn cho một bộ phân tích LR (không nhất thiết phải cho biết trạng thái nào ứng với mục nào — chỉ cần dùng bảng như một "máy" để chạy), cùng danh sách các sản xuất của văn phạm (đánh số 1-based). Hãy mô phỏng bộ điều khiển LR (LR driver) tiêu chuẩn để phân tích một chuỗi token đầu vào (bảng được đảm bảo không có xung đột — mỗi cặp (trạng thái, ký hiệu) có tối đa một hành động).
Bộ điều khiển LR hoạt động với một ngăn xếp trạng thái, khởi tạo là [0], và một con trỏ vào vị trí đầu chuỗi token (chuỗi token luôn được ngầm định kết thúc bằng ký hiệu $):
ACTION[s][a]:
GOTO[s'][A] để lấy trạng thái s3, đẩy s3 vào ngăn xếp; ghi nhận sản xuất i vừa dùng.$ được đánh số n+1 với n là số token đầu vào thực sự).Yêu cầu: nếu phân tích thành công, in ra danh sách các sản xuất đã REDUCE, theo đúng thứ tự thực hiện; nếu có lỗi, in vị trí lỗi.
LHS -> s1 s2 ... sk (sản xuất thứ i được đánh số theo thứ tự xuất hiện, 1-based).s a S s2 — tại trạng thái s, với terminal a: SHIFT sang trạng thái s2;s a R i — tại trạng thái s, với terminal a: REDUCE theo sản xuất i;s a ACC — tại trạng thái s, với terminal $: ACCEPT.s A s2 (tại trạng thái s, với non-terminal A: chuyển tới trạng thái s2).$; dòng trống nếu không có token nào).Nếu phân tích thành công: in 2 dòng — dòng 1 là ACCEPT; dòng 2 là danh sách số hiệu các sản xuất đã REDUCE theo đúng thứ tự thực hiện, cách nhau một dấu cách (dòng trống nếu không có REDUCE nào).
Nếu có lỗi tại vị trí p (1-based, p=n+1 ứng với ký hiệu $ nếu lỗi xảy ra ở cuối, n là số token đầu vào): in đúng một dòng ERROR p.
Ví dụ:
Đầu vào:
6
E -> E + T
E -> T
T -> T * F
T -> F
F -> ( E )
F -> id
36
0 ( S 2
0 id S 1
1 ) R 6
1 * R 6
1 $ R 6
1 + R 6
2 ( S 2
2 id S 1
3 * S 8
3 $ R 2
3 + R 2
3 ) R 2
4 ) R 4
4 * R 4
4 $ R 4
4 + R 4
5 $ ACC
5 + S 6
6 ( S 2
6 id S 1
7 * S 8
7 $ R 1
7 + R 1
7 ) R 1
8 ( S 2
8 id S 1
9 ) R 3
9 * R 3
9 $ R 3
9 + R 3
10 + S 6
10 ) S 11
11 ) R 5
11 * R 5
11 $ R 5
11 + R 5
9
0 T 3
0 F 4
0 E 5
6 F 4
6 T 7
8 F 9
2 T 3
2 F 4
2 E 10
id + id * id
Đầu ra:
ACCEPT
6 4 2 6 4 6 3 1
Đầu vào:
6
E -> E + T
E -> T
T -> T * F
T -> F
F -> ( E )
F -> id
36
0 ( S 2
0 id S 1
1 ) R 6
1 * R 6
1 $ R 6
1 + R 6
2 ( S 2
2 id S 1
3 * S 8
3 $ R 2
3 + R 2
3 ) R 2
4 ) R 4
4 * R 4
4 $ R 4
4 + R 4
5 $ ACC
5 + S 6
6 ( S 2
6 id S 1
7 * S 8
7 $ R 1
7 + R 1
7 ) R 1
8 ( S 2
8 id S 1
9 ) R 3
9 * R 3
9 $ R 3
9 + R 3
10 + S 6
10 ) S 11
11 ) R 5
11 * R 5
11 $ R 5
11 + R 5
9
0 T 3
0 F 4
0 E 5
6 F 4
6 T 7
8 F 9
2 T 3
2 F 4
2 E 10
( id + id ) * id
Đầu ra:
ACCEPT
6 4 2 6 4 1 5 4 6 3 2
Đang tải editor...