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] Thực thi chuỗi hành động Shift-Reduce cho trước

    Khác với việc tự suy ra dãy hành động shift/reduce từ một văn phạm, bài này yêu cầu bạn đóng vai "máy thực thi": cho trước một văn phạm phi ngữ cảnh (các sản xuất được đánh số 1-based), một chuỗi token đầu vào, và một dãy hành động shift/reduce đã định sẵn — hãy mô phỏng chính xác ngăn xếp ký hiệu (symbol stack) khi thực hiện lần lượt các hành động đó.

    • Hành động S (SHIFT): lấy token tiếp theo trong luồng vào và đẩy vào đỉnh ngăn xếp. Nếu không còn token nào để lấy, đây là lỗi.
    • Hành động R i (REDUCE theo sản xuất thứ iii, dạng A→αA \to \alphaA→α): xét ∣α∣|\alpha|∣α∣ ký hiệu ở đỉnh ngăn xếp (nếu α\alphaα rỗng thì không cần lấy gì); nếu ∣α∣|\alpha|∣α∣ ký hiệu đó (theo đúng thứ tự, từ dưới lên trên) không khớp với α\alphaα, hoặc ngăn xếp không đủ ∣α∣|\alpha|∣α∣ phần tử, đây là lỗi. Nếu khớp, lấy ∣α∣|\alpha|∣α∣ ký hiệu đó ra khỏi ngăn xếp rồi đẩy AAA (vế trái) vào.

    Nếu một hành động gây lỗi, dừng ngay lập tức tại hành động đó (các hành động sau không thực hiện). Nếu toàn bộ dãy hành động thực hiện thành công, xét: nếu đã dùng hết toàn bộ token đầu vào và ngăn xếp cuối cùng chỉ còn đúng 1 ký hiệu, đúng bằng vế trái của sản xuất thứ 1 (quy ước là ký hiệu bắt đầu văn phạm) — kết quả là ACCEPT; ngược lại là REJECT (đây không phải là lỗi thực thi, chỉ là chưa phân tích trọn vẹn).

    Ví dụ: văn phạm gồm 2 sản xuất S -> S + S và S -> id; token vào: id + id; dãy hành động: S, R 2, S, S, R 2, R 1 — ngăn xếp cuối cùng là S, đã dùng hết token → in ra ACCEPT rồi S.

    • Định dạng đầu vào:
      • Dòng 1: số nguyên nnn — số sản xuất.
      • nnn dòng tiếp theo: mỗi dòng có dạng LHS s1 s2 ... sk (vế trái, rồi các ký hiệu vế phải cách nhau khoảng trắng theo đúng thứ tự; nếu vế phải rỗng, dòng chỉ có LHS).
      • Dòng tiếp theo: số nguyên mmm — số token đầu vào.
      • Dòng tiếp theo: mmm token cách nhau khoảng trắng (dòng trống nếu m=0m = 0m=0, dòng này luôn có mặt).
      • Dòng tiếp theo: số nguyên ttt — số hành động.
      • ttt dòng tiếp theo: mỗi dòng là S hoặc R i.
    • Định dạng đầu ra:

      Nếu có hành động gây lỗi tại bước thứ kkk (1-based): in đúng một dòng ERROR k. Ngược lại in 2 dòng: dòng 1 là ACCEPT hoặc REJECT; dòng 2 là nội dung ngăn xếp cuối cùng, các ký hiệu cách nhau đúng một dấu cách (dòng trống nếu ngăn xếp rỗng).

    Ví dụ:

    Đầu vào:

    2
    S S + S
    S id
    3
    id + id
    6
    S
    R 2
    S
    S
    R 2
    R 1
    

    Đầu ra:

    ACCEPT
    S
    

    Đầu vào:

    1
    S id
    1
    id
    2
    S
    R 1
    

    Đầu ra:

    ACCEPT
    S
    

    Đang tải editor...