Cho một văn phạm phi ngữ cảnh (CFG) với các luật sinh được đánh số 1,2,…,k, một chuỗi token đầu vào, và một dãy hành động được đề xuất gồm các bước SHIFT hoặc REDUCE i. Hãy mô phỏng một máy Shift-Reduce dùng ngăn xếp (stack) để kiểm chứng xem dãy hành động này có được thực hiện hợp lệ hay không.
Máy có một ngăn xếp ban đầu rỗng và một con trỏ đọc, ban đầu trỏ vào token đầu tiên của chuỗi input. Các hành động được thực hiện tuần tự:
Nếu tại bước thứ j (1-indexed) gặp một hành động không hợp lệ, dừng ngay lập tức và báo lỗi tại bước đó — các bước sau không được xét tới.
Nếu toàn bộ dãy hành động đều hợp lệ, kiểm tra thêm: input đã được đọc hết (con trỏ đã vượt qua token cuối) và trên stack chỉ còn đúng 1 ký hiệu, đúng bằng ký hiệu bắt đầu S0 của văn phạm hay không — nếu đúng thì dãy hành động này đã phân tích chấp nhận (ACCEPT) chuỗi input, ngược lại chỉ là một dãy hành động hợp lệ nhưng chưa hoàn tất phân tích (REJECT).
Ví dụ: văn phạm S→(S)∣ε (luật 1, luật 2), input ( ), dãy hành động SHIFT, REDUCE 2, SHIFT, REDUCE 1 mô phỏng: stack lần lượt là [(], [(, S], [(, S, )], rồi reduce luật 1 khớp ( S ) cho ra [S]. Toàn bộ input đã đọc hết, stack chỉ còn S = S_0$ → kết quả ACCEPT.
A -> X1 X2 ... Xm (các ký hiệu cách nhau bởi khoảng trắng); nếu luật rỗng, ghi A -> ε.SHIFT hoặc REDUCE i (với 1≤i≤k).Nếu tại bước j gặp hành động không hợp lệ đầu tiên: in đúng một dòng INVALID j rồi dừng (không in gì thêm).
Nếu toàn bộ t hành động đều hợp lệ: in dòng đầu tiên VALID, rồi in dòng thứ hai là ACCEPT nếu điều kiện chấp nhận (đọc hết input và stack chỉ còn đúng S0) được thoả mãn, ngược lại in REJECT.
Ví dụ:
Đầu vào:
2 S
S -> ( S )
S -> ε
1
(
3
SHIFT
REDUCE 2
REDUCE 1
Đầu ra:
INVALID 3
Đầu vào:
2 S
S -> ( S )
S -> ε
2
( )
4
SHIFT
REDUCE 2
SHIFT
REDUCE 1
Đầu ra:
VALID
ACCEPT
Đang tải editor...