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] SLR: Sinh các mục reduce từ FOLLOW

    Đề bài

    Trong phương pháp SLR(1), với mỗi item hoàn chỉnh A -> α . trong trạng thái s, ta thêm hành động reduce A -> α vào ô ACTION[s, t] cho mọi ký hiệu kết thúc t thuộc FOLLOW(A). Đây là điểm khác biệt giúp SLR giải quyết nhiều trường hợp mà LR(0) không xử lý được.

    Cho văn phạm (để đánh số luật), các tập FOLLOW, và mô tả các trạng thái (tập item), hãy sinh ra các mục reduce của bảng ACTION.

    Khái niệm

    • Luật đánh số từ 1 theo thứ tự nhập.
    • Chỉ item hoàn chỉnh mới tạo mục reduce.

    Ví dụ

    Nếu state 2 có item E -> T . (luật 2) và FOLLOW(E) = { + $ }, ta thêm 2 + r2 và 2 $ r2.

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

      Dòng đầu n rồi n luật sinh. Dòng tiếp nf rồi nf dòng A: t1 t2 ... (FOLLOW). Dòng tiếp ns rồi với mỗi trạng thái: một dòng id k rồi k item.

    • Ràng buộc đầu vào:

      1 ≤ n ≤ 30, 1 ≤ ns ≤ 50. Ký hiệu không kết thúc là chữ in hoa.

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

      In các mục reduce dạng <state> <terminal> r<rule>, sắp xếp tăng dần theo (state, terminal, rule), bỏ trùng. Nếu không có in NONE.

    Ví dụ:

    Đầu vào:

    2
    E -> E + T
    E -> T
    1
    E: + $
    1
    2 1
    E -> T .
    

    Đầu ra:

    2 $ r2
    2 + r2

    Giải thích:

    State 2 có item hoàn chỉnh E -> T . là luật 2. FOLLOW(E)={+, $} nên thêm reduce r2 cho cả $ và +: '2 $ r2' và '2 + r2'. Sắp xếp tăng dần theo ký hiệu kết thúc ($ đứng trước + theo mã ASCII).

    Đang tải editor...