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 GOTO(I, X) trong automaton LR(0)

    Tiếp nối khái niệm CLOSURE, phép toán GOTO dùng để tính trạng thái kế tiếp của automaton LR(0) khi automaton đang ở tập mục III (đã được đóng — closed) và đọc vào một ký hiệu văn phạm XXX (có thể là terminal hoặc non-terminal):

    GOTO(I,X)=CLOSURE({[A→αX . β]∣[A→α . Xβ]∈I})\text{GOTO}(I, X) = \text{CLOSURE}\big(\{[A \to \alpha X \,.\, \beta] \mid [A \to \alpha \,.\, X\beta] \in I\}\big)GOTO(I,X)=CLOSURE({[A→αX.β]∣[A→α.Xβ]∈I})

    Nói cách khác: lấy tất cả mục trong III có dấu chấm nằm ngay trước ký hiệu XXX, dịch chuyển dấu chấm qua phải XXX để tạo thành tập lõi (core), rồi tính CLOSURE của tập lõi đó theo đúng định nghĩa CLOSURE (xem lại: non-terminal là ký hiệu xuất hiện ở LHS của ít nhất 1 luật sinh trong văn phạm).

    Nếu tập lõi rỗng (không có mục nào trong III có dấu chấm ngay trước XXX), quy ước GOTO(I,X)\text{GOTO}(I,X)GOTO(I,X) không tồn tại.

    Cho văn phạm, tập mục III (đã đóng) và ký hiệu XXX, hãy tính GOTO(I,X)\text{GOTO}(I, X)GOTO(I,X).

    Ví dụ: văn phạm E -> E + T(1), E -> T(2), T -> id(3); I={(1,0),(2,0),(3,0)}I = \{(1,0), (2,0), (3,0)\}I={(1,0),(2,0),(3,0)} (tức CLOSURE của [E→.E+T][E \to .E+T][E→.E+T]). Với X=TX = TX=T: các mục có dấu chấm trước TTT là (1,0)(1,0)(1,0)? không — (1,0)(1,0)(1,0) là E→.E+TE \to .E+TE→.E+T, dấu chấm đứng trước EEE chứ không phải TTT. Mục (2,0)(2,0)(2,0): E→.TE \to .TE→.T, dấu chấm trước TTT → dịch thành (2,1)(2,1)(2,1). Core ={(2,1)}=\{(2,1)\}={(2,1)}, CLOSURE không mở rộng thêm gì (dấu chấm ở cuối). Vậy GOTO(I,T)={(2,1)}\text{GOTO}(I,T) = \{(2,1)\}GOTO(I,T)={(2,1)}.

    • Định dạng đầu vào:
      • Dòng 1: số nguyên kkk (1≤k≤2001 \le k \le 2001≤k≤200) — số luật sinh, đánh số 1…k1 \ldots k1…k.
      • kkk dòng tiếp theo: luật sinh dạng A -> X1 X2 ... Xm (nếu rỗng: A -> ε).
      • Dòng tiếp theo: số nguyên n0n_0n0​ — số mục trong tập III (đã đóng).
      • n0n_0n0​ dòng tiếp theo: mỗi dòng i p.
      • Dòng cuối: ký hiệu XXX (một chuỗi không chứa khoảng trắng, có thể là terminal hoặc non-terminal của văn phạm, hoặc một ký hiệu không xuất hiện trong văn phạm).
    • Định dạng đầu ra:

      Nếu tập lõi rỗng: in đúng một dòng EMPTY.

      Ngược lại: in dòng đầu là số lượng mục của GOTO(I,X)\text{GOTO}(I,X)GOTO(I,X), sau đó mỗi dòng một mục i p, sắp xếp tăng dần theo (i,p)(i, p)(i,p) như ở bài CLOSURE.

    Ví dụ:

    Đầu vào:

    6
    E -> E + T
    E -> T
    T -> T * F
    T -> F
    F -> ( E )
    F -> id
    6
    1 0
    2 0
    3 0
    4 0
    5 0
    6 0
    E
    

    Đầu ra:

    1
    1 1
    

    Đầu vào:

    6
    E -> E + T
    E -> T
    T -> T * F
    T -> F
    F -> ( E )
    F -> id
    6
    1 0
    2 0
    3 0
    4 0
    5 0
    6 0
    T
    

    Đầu ra:

    2
    2 1
    3 1
    

    Đang tải editor...