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] Tính FOLLOW và phát hiện xung đột SLR(1)

    Với một văn phạm phi ngữ cảnh (quy ước ký hiệu như bài toán xây dựng tập trạng thái LR(0): ký hiệu chưa kết thúc là chữ in hoa A-Z; đảm bảo mọi ký hiệu chưa kết thúc dùng ở vế phải đều có luật sinh riêng), hãy:

    1. Tính tập FIRST và tập FOLLOW của các ký hiệu chưa kết thúc theo thuật toán chuẩn (FOLLOW của ký hiệu bắt đầu luôn chứa $).
    2. Xây dựng tập chính tắc các trạng thái LR(0) (theo đúng thuật toán và cách đánh số ở bài toán xây dựng tự động LR(0): BFS theo thứ tự tạo ra, ký hiệu goto duyệt theo thứ tự từ điển tăng dần, văn phạm mở rộng bằng S′→SS' \to SS′→S).
    3. Với mỗi trạng thái, xây dựng các hành động ACTION theo quy tắc SLR(1):
      • Mục A→α.aβA \to \alpha.a\betaA→α.aβ (aaa là ký hiệu kết thúc) → hành động shift trên aaa.
      • Mục A→α.A \to \alpha.A→α. (dấu chấm cuối, A≠S′A \ne S'A=S′) → hành động reduce theo luật sinh này, trên mọi ký hiệu b∈FOLLOW(A)b \in \text{FOLLOW}(A)b∈FOLLOW(A).
      • Mục S′→S.S' \to S.S′→S. → hành động accept trên $.
    4. Với mỗi ô (trạng thái, ký hiệu kết thúc): nếu có shift và ít nhất một reduce/accept cùng lúc → xung đột SR; nếu có từ hai hành động reduce/accept trở lên → xung đột RR. Đếm tổng số ô xung đột SR và tổng số ô xung đột RR trên toàn bảng.

    Văn phạm là SLR(1) khi và chỉ khi không có xung đột nào (cả SR lẫn RR đều bằng 0).

    Ví dụ (văn phạm KHÔNG phải SLR(1)): S→L=R∣R,  L→∗R∣id,  R→LS \to L{=}R \mid R,\; L \to {*}R \mid \text{id},\; R \to LS→L=R∣R,L→∗R∣id,R→L có 10 trạng thái LR(0), và có đúng 1 xung đột shift-reduce (tại trạng thái chứa đồng thời mục S→L.=RS \to L.{=}RS→L.=R và R→L.R \to L.R→L., khi ký hiệu vào là =), 0 xung đột reduce-reduce → không phải SLR(1).

    • Định dạng đầu vào:

      Dòng đầu: S P — SSS là ký hiệu bắt đầu, PPP (1≤P≤301 \le P \le 301≤P≤30) số luật sinh. PPP dòng tiếp theo: A -> X1 ... Xk (k=0 ghi A -> eps).

    • Định dạng đầu ra:

      In ra 4 dòng: dòng 1 — tổng số trạng thái LR(0); dòng 2 — số ô có xung đột SR; dòng 3 — số ô có xung đột RR; dòng 4 — SLR(1): YES nếu dòng 2 và dòng 3 đều bằng 0, ngược lại SLR(1): NO.

    Ví dụ:

    Đầu vào:

    S 5
    S -> L = R
    S -> R
    L -> * R
    L -> id
    R -> L

    Đầu ra:

    10
    1
    0
    SLR(1): NO
    

    Đầu vào:

    E 6
    E -> E + T
    E -> T
    T -> T * F
    T -> F
    F -> ( E )
    F -> id

    Đầu ra:

    12
    0
    0
    SLR(1): YES
    

    Đang tải editor...