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 trong bảng SLR(1)

    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:

    • Nếu dấu chấm nằm ngay trước một terminal aaa (mục dạng A -> α . a γ), trạng thái này cho phép SHIFT trên aaa.
    • Nếu dấu chấm ở cuối (mục hoàn chỉnh, dạng A -> α .), và A≠A \neA= S', trạng thái này cho phép REDUCE theo sản xuất A→αA \to \alphaA→α đối với mọi terminal a∈FOLLOW(A)a \in \text{FOLLOW}(A)a∈FOLLOW(A) (quy tắc SLR(1)). Riêng mục hoàn chỉnh với A=A = 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 aaa, 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 aaa:

    • đúng 1 SHIFT và đúng 1 REDUCE → shift-reduce;
    • từ 2 REDUCE trở lên, không có SHIFT → reduce-reduce;
    • 1 SHIFT và từ 2 REDUCE trở lên → 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ại. Tại .Tạib:vừacoˊSHIFT(từmụcthứhai)vừacoˊREDUCE: vừa có SHIFT (từ mục thứ hai) vừa có REDUCE :vừacoˊSHIFT(từmụcthứhai)vừacoˊREDUCEA \to a(vıˋ(vì(vıˋb \in \text{FOLLOW}(A))→xungđột‘shift−reduce‘tại‘b‘.Tại‘) → xung đột `shift-reduce` tại `b`. Tại `)→xungđột‘shift−reduce‘tại‘b‘.Tại‘`: chỉ có REDUCE → không xung đột.

    • Định dạng đầu vào:
      • Dòng 1: số nguyên nnn — số mục trong trạng thái.
      • nnn dòng tiếp theo: mỗi dòng là một mục, viết dưới dạng các ký hiệu cách nhau khoảng trắng: 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 -> .).
      • Dòng tiếp theo: số nguyên mmm — số dòng định nghĩa tập FOLLOW.
      • mmm dòng tiếp theo: mỗi dòng dạng A: t1 t2 ... tk liệt kê các terminal trong FOLLOW(A)\text{FOLLOW}(A)FOLLOW(A) (chỉ cần liệt kê cho các AAA là vế trái của mục hoàn chỉnh khác S').
    • Định dạng đầu ra:

      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...