Với một trạng thái (tập mục LR(0) đã đóng) I trong bảng phân tích SLR(1), hành động ACTION cho từng ký hiệu kết thúc a được xác định như sau (giả sử sản xuất số 1 luôn là sản xuất mở rộng S′→S):
ACTION[a] có thể shift.ACTION[a] có thể reduce theo sản xuất A→α.ACTION[\$] là accept.Nếu với cùng một ký hiệu a, có từ hai hành động khác nhau trở lên được xác định, trạng thái I có xung đột (shift/reduce nếu một trong số đó là shift, reduce/reduce nếu tất cả đều là reduce nhưng theo các sản xuất khác nhau — một ô có thể vừa là shift/reduce vừa chứa nhiều reduce cùng lúc).
Cho văn phạm (sản xuất 1 luôn là S′→S), tập FOLLOW của các phi kết thúc liên quan, và một trạng thái I (tập mục đã đóng), hãy dựng dòng ACTION tương ứng và cho biết trạng thái có xung đột hay không.
Ví dụ: với I={T→F⋅} và FOLLOW(T) = \{+, *, \, )}:doˋngACTIONcoˊreducetheosảnxua^ˊt"T \to F"tạicả4kyˊhiệu‘+∗ )`, không có shift nên không xung đột.
A -> X1 ... Xk hoặc A -> #, đánh số 1,…,n theo thứ tự.A: t1 t2 ... — tập FOLLOW(A) (các ký hiệu kết thúc cách nhau khoảng trắng; ký hiệu kết thúc chuỗi được viết là $).A -> β . γ (định dạng dấu chấm như các bài trước).a: hành_động. Nếu ô có nhiều hành động (xung đột), các hành động được nối bởi dấu / theo thứ tự: shift (nếu có) trước, rồi các reduce k theo thứ tự k tăng dần, cuối cùng là accept (nếu có). Mỗi hành động được viết là shift, reduce k (k là số hiệu sản xuất), hoặc accept.OK nếu không có ký hiệu nào có từ 2 hành động trở lên, ngược lại CONFLICT.Ví dụ:
Đầu vào:
7
E' -> E
E -> E + T
E -> T
T -> T * F
T -> F
F -> ( E )
F -> id
3
E: + $ )
T: + * $ )
F: + * $ )
1
T -> F .
Đầu ra:
4
$: reduce 5
): reduce 5
*: reduce 5
+: reduce 5
OK
Đầu vào:
3
S' -> S
S -> S + S
S -> id
1
S: + $
2
S -> S + S .
S -> S . + S
Đầu ra:
2
$: reduce 2
+: shift/reduce 2
CONFLICT
Đang tải editor...