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] Kiểm tra văn phạm có phải SLR(1)

    Cho văn phạm phi ngữ cảnh, dựng bộ tự động LR(0) chính tắc (như mô tả ở bài "Số trạng thái của bộ tự động LR(0) chính tắc": tăng cường S′→SS' \to SS′→S, đánh số trạng thái bằng BFS, duyệt ký hiệu theo thứ tự từ điển) và tính tập FOLLOWFOLLOWFOLLOW cho từng non-terminal theo thuật toán chuẩn (coi ký hiệu kết thúc chuỗi là $, FOLLOW(S)FOLLOW(S)FOLLOW(S) chứa $).

    Với mỗi trạng thái IiI_iIi​ của bộ tự động, gọi IiI_iIi​ có XUNG ĐỘT nếu:

    1. reduce/reduce: tồn tại 2 mục hoàn chỉnh (con trỏ ở cuối) KHÁC NHAU A→α.A \to \alpha.A→α. và B→β.B \to \beta.B→β. trong IiI_iIi​ (có thể A=BA=BA=B nếu khác vế phải) sao cho FOLLOW(A)∩FOLLOW(B)≠∅FOLLOW(A) \cap FOLLOW(B) \ne \emptysetFOLLOW(A)∩FOLLOW(B)=∅; hoặc
    2. shift/reduce: tồn tại mục hoàn chỉnh A→α.A \to \alpha.A→α. trong IiI_iIi​ và một terminal a∈FOLLOW(A)a \in FOLLOW(A)a∈FOLLOW(A) sao cho GOTO(Ii,a)GOTO(I_i, a)GOTO(Ii​,a) khác rỗng (tức IiI_iIi​ có mục dạng ⋅→….a…\cdot \to \ldots . a \ldots⋅→….a…).

    (Mục hoàn chỉnh có LHS=S′LHS = S'LHS=S′ ứng với hành động ACCEPT, không tính là reduce, bỏ qua khi xét xung đột.)

    Văn phạm là SLR(1) khi và chỉ khi KHÔNG trạng thái nào có xung đột.

    Ví dụ: văn phạm S -> L = R, S -> R, L -> * R, L -> id, R -> L KHÔNG phải SLR(1) — trạng thái chứa mục R -> L . có xung đột shift/reduce trên ký hiệu =.

    • Định dạng đầu vào:
      • Dòng 1: số nguyên nnn — số sản xuất của văn phạm.
      • nnn dòng tiếp theo: các sản xuất dạng A -> X1 X2 ... Xk (vế phải rỗng thì A ->). Ký hiệu bắt đầu bằng chữ hoa là non-terminal, còn lại là terminal. Đảm bảo văn phạm không chứa ký hiệu S' hay $.
    • Định dạng đầu ra:
      • Nếu văn phạm là SLR(1): in duy nhất dòng SLR(1).
      • Ngược lại: dòng đầu in NOT SLR(1), dòng thứ hai in danh sách CHỈ SỐ các trạng thái có xung đột (đánh số theo đúng quy tắc BFS như bài dựng bộ tự động LR(0)), TĂNG DẦN, cách nhau đúng 1 dấu cách.

    Ví dụ:

    Đầu vào:

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

    Đầu ra:

    SLR(1)
    

    Đầu vào:

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

    Đầu ra:

    NOT SLR(1)
    2
    

    Đang tải editor...