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 CLOSURE của tập mục LR(0)

    Trong xây dựng bộ phân tích LR, mỗi trạng thái của automaton LR(0) là một tập mục (item set). Một mục của luật sinh A→X1X2…XmA \to X_1 X_2 \ldots X_mA→X1​X2​…Xm​ được ký hiệu bằng cặp (i,p)(i, p)(i,p) với iii là số hiệu luật sinh và 0≤p≤m0 \le p \le m0≤p≤m là vị trí dấu chấm — nghĩa là mục [A→X1…Xp . Xp+1…Xm][A \to X_1 \ldots X_p \,.\, X_{p+1} \ldots X_m][A→X1​…Xp​.Xp+1​…Xm​].

    Phép toán CLOSURE trên một tập mục III được định nghĩa như sau: lặp lại cho tới khi không còn thay đổi — với mỗi mục [A→α . Bβ]∈I[A \to \alpha \,.\, B\beta] \in I[A→α.Bβ]∈I mà BBB là một ký hiệu không kết thúc (non-terminal), với mỗi luật sinh B→γB \to \gammaB→γ trong văn phạm, nếu mục [B→. γ][B \to .\, \gamma][B→.γ] (tức (j,0)(j, 0)(j,0) với jjj là số hiệu luật B→γB \to \gammaB→γ) chưa có trong III thì thêm vào III.

    Một ký hiệu được coi là non-terminal nếu nó xuất hiện ở vế trái (LHS) của ít nhất một luật sinh trong văn phạm cho trước; các ký hiệu khác là terminal.

    Cho văn phạm và một tập mục lõi (kernel) III ban đầu, hãy tính CLOSURE(I)\text{CLOSURE}(I)CLOSURE(I).

    Ví dụ: văn phạm gồm 2 luật E -> E + T(1), E -> T(2); kernel I={(1,0)}I = \{(1,0)\}I={(1,0)} (tức [E→.E+T][E \to . E + T][E→.E+T]). Vì sau dấu chấm là EEE (non-terminal), ta thêm mục (2,0)(2,0)(2,0) (E→.TE \to .TE→.T). Với TTT không phải LHS của luật nào trong văn phạm này nên không mở rộng thêm. Kết quả: CLOSURE(I)={(1,0),(2,0)}\text{CLOSURE}(I) = \{(1,0), (2,0)\}CLOSURE(I)={(1,0),(2,0)}.

    • Đị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, được đánh số 1…k1 \ldots k1…k theo thứ tự xuất hiện.
      • kkk dòng tiếp theo: luật sinh dạng A -> X1 X2 ... Xm (nếu rỗng: A -> ε). Ký hiệu không chứa khoảng trắng.
      • Dòng tiếp theo: số nguyên k0k_0k0​ (1≤k0≤2001 \le k_0 \le 2001≤k0​≤200) — số mục lõi ban đầu trong III.
      • k0k_0k0​ dòng tiếp theo: mỗi dòng gồm hai số nguyên i p — số hiệu luật sinh và vị trí dấu chấm (0≤p≤0 \le p \le0≤p≤ độ dài vế phải luật iii).
    • Định dạng đầu ra:

      In dòng đầu tiên là số lượng mục trong CLOSURE(I)\text{CLOSURE}(I)CLOSURE(I). Sau đó, mỗi dòng in một mục dưới dạng i p, các mục được sắp xếp tăng dần theo iii trước, nếu bằng nhau thì theo ppp.

    Ví dụ:

    Đầu vào:

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

    Đầu ra:

    6
    1 0
    2 0
    3 0
    4 0
    5 0
    6 0
    

    Đầu vào:

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

    Đầu ra:

    7
    1 0
    2 0
    3 0
    4 0
    5 0
    5 1
    6 0
    

    Đang tải editor...