Cho một trạng thái (tập mục — item set) của tự động LR(0)/SLR(1) trong quá trình phân tích cú pháp, hãy xác định xem trạng thái đó có gây xung đột khi xây dựng bảng phân tích SLR(1) hay không.
Quy ước ký hiệu: một ký hiệu bắt đầu bằng chữ in hoa (có thể có dấu ' theo sau, ví dụ S') là ký hiệu chưa kết thúc (non-terminal); mọi ký hiệu khác (chữ thường, chữ số, hoặc các ký hiệu như +, *, (, ), id, $) là ký hiệu kết thúc (terminal). Ký hiệu $ là ký hiệu kết thúc xâu vào.
Mỗi mục (item) trong trạng thái có dạng A -> α . β với dấu chấm . thể hiện vị trí đã đọc tới. Với mỗi mục:
A -> α . a γ), trạng thái này cho phép SHIFT trên a.A -> α .), và A= S', trạng thái này cho phép REDUCE theo sản xuất A→α đối với mọi terminal a∈FOLLOW(A) (quy tắc SLR(1)). Riêng mục hoàn chỉnh với A= S' (ví dụ S' -> E .) chỉ tương ứng hành động ACCEPT trên $, không tính là REDUCE khi xét xung đột.Với mỗi terminal a, nếu có từ 2 hành động khả dụng trở lên (được suy ra như trên) thì đó là xung đột tại a:
shift-reduce;reduce-reduce;shift-reduce-reduce.Ví dụ: trạng thái gồm 2 mục A -> a . và B -> a . b, với \text{FOLLOW}(A) = \{b, \}.Tạib:vừacoˊSHIFT(từmụcthứhai)vừacoˊREDUCEA \to a(vıˋb \in \text{FOLLOW}(A))→xungđột‘shift−reduce‘tại‘b‘.Tại‘`: chỉ có REDUCE → không xung đột.
LHS -> ... trong đó dấu chấm . xuất hiện đúng một lần trong phần vế phải để đánh dấu vị trí (nếu vế phải rỗng và đã hoàn chỉnh, viết LHS -> .).A: t1 t2 ... tk liệt kê các terminal trong FOLLOW(A) (chỉ cần liệt kê cho các A là vế trái của mục hoàn chỉnh khác S').In dòng đầu tiên là CONFLICT nếu tồn tại ít nhất một terminal xung đột, hoặc NO CONFLICT nếu không có xung đột nào.
Nếu có xung đột, các dòng tiếp theo liệt kê từng terminal xung đột theo thứ tự tăng dần (so sánh chuỗi ASCII chuẩn), mỗi dòng dạng terminal: loại với loại là một trong shift-reduce, reduce-reduce, shift-reduce-reduce.
Ví dụ:
Đầu vào:
2
E -> E + T .
T -> T . * F
1
E: + ) $
Đầu ra:
NO CONFLICT
Đầu vào:
2
A -> a .
B -> a . b
1
A: b $
Đầu ra:
CONFLICT
b: shift-reduce
Đang tải editor...