Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Phát hiện xung đột Shift-Reduce / Reduce-Reduce

    Khi xây dựng bảng ACTION cho một bộ phân tích SLR, đôi khi tại cùng một ô (một cặp trạng thái, ký hiệu kết thúc) lại có nhiều hơn một hành động được đề xuất — đó chính là xung đột (conflict) khiến văn phạm không thuộc lớp SLR(1). Cho một bảng ACTION thô dưới dạng danh sách các bộ ba (state, terminal, action) (có thể trùng lặp, có thể mâu thuẫn), với action là một trong: S<k> (shift đến trạng thái kkk), R<i> (reduce theo luật iii), hoặc ACC (accept). Trong đề bài này, ACC chỉ xuất hiện đơn lẻ ứng với ký hiệu $ và không bao giờ xung đột với hành động khác.

    Với mỗi cặp (state, terminal) xuất hiện trong bảng, gom tất cả các hành động khác nhau về nội dung được đề xuất cho cặp đó (nếu bảng liệt kê 2 dòng giống hệt nhau cho cùng 1 cặp thì chỉ tính là 1 hành động, không phải xung đột). Nếu tập hành động của một cặp có từ 2 phần tử trở lên:

    • Nếu trong đó có ít nhất 1 shift và ít nhất 1 reduce → đây là xung đột shift-reduce, ký hiệu SR.
    • Ngược lại, nếu có từ 2 reduce khác nhau trở lên (không có shift nào) → đây là xung đột reduce-reduce, ký hiệu RR.

    Hãy liệt kê tất cả các xung đột tìm được.

    Ví dụ: nếu bảng có 2 dòng 2 + S6 và 2 + R2, thì tại (state=2, terminal="+") có cả shift và reduce → xung đột 2 + SR.

    • Định dạng đầu vào:
      • Dòng 1: số nguyên nnn (0≤n≤50000 \le n \le 50000≤n≤5000) — số dòng của bảng ACTION.
      • nnn dòng tiếp theo, mỗi dòng có dạng state terminal action (state là số nguyên ≥0\ge 0≥0, terminal là một chuỗi không chứa khoảng trắng, action có dạng S<k>, R<i> hoặc ACC).
    • Định dạng đầu ra:

      Nếu không có xung đột nào: in đúng một dòng NONE.

      Ngược lại: in mỗi xung đột trên một dòng theo định dạng state terminal type (type là SR hoặc RR), các dòng được sắp xếp tăng dần theo state, nếu bằng nhau thì theo thứ tự từ điển của terminal.

    Ví dụ:

    Đầu vào:

    4
    0 id S5
    0 ( S4
    1 + S6
    1 $ ACC
    

    Đầu ra:

    NONE
    

    Đầu vào:

    6
    2 + S6
    2 + R2
    2 * S7
    2 $ R2
    5 ) R4
    5 + R4
    

    Đầu ra:

    2 + SR
    

    Đang tải editor...