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] Đếm số trạng thái của tự động LR(0) chuẩn tắc

    Cho một văn phạm phi ngữ cảnh nhỏ, ký hiệu bắt đầu là vế trái của sản xuất đầu tiên trong danh sách. Quy ước ký hiệu (giống bài phát hiện xung đột SLR(1)): ký hiệu bắt đầu bằng chữ in hoa là non-terminal, mọi ký hiệu khác là terminal.

    Hãy xây dựng tự động LR(0) chuẩn tắc (canonical LR(0) automaton) của văn phạm theo đúng thuật toán kinh điển:

    1. Thêm sản xuất mở rộng S′→SS' \to SS′→S, trong đó SSS là ký hiệu bắt đầu (đảm bảo S′S'S′ không trùng với bất kỳ ký hiệu nào đã xuất hiện trong văn phạm gốc).
    2. Trạng thái ban đầu I0=closure({S′→⋅S})I_0 = \text{closure}(\{S' \to \cdot S\})I0​=closure({S′→⋅S}), với closure\text{closure}closure được tính bằng cách: với mọi mục A→α⋅BβA \to \alpha \cdot B \betaA→α⋅Bβ trong tập (BBB là non-terminal), thêm vào tập tất cả các mục B→⋅γB \to \cdot \gammaB→⋅γ ứng với mọi sản xuất B→γB \to \gammaB→γ, lặp lại tới khi tập không đổi.
    3. Với mỗi trạng thái III đã có và mỗi ký hiệu văn phạm XXX (terminal hoặc non-terminal) mà có mục dạng A→α⋅XβA \to \alpha \cdot X \betaA→α⋅Xβ trong III: goto(I,X)=closure({A→αX⋅β∣A→α⋅Xβ∈I})\text{goto}(I, X) = \text{closure}(\{A \to \alpha X \cdot \beta \mid A \to \alpha \cdot X \beta \in I\})goto(I,X)=closure({A→αX⋅β∣A→α⋅Xβ∈I}). Nếu tập kết quả khác rỗng và chưa tồn tại như một trạng thái, thêm nó vào tập hợp các trạng thái.
    4. Lặp lại bước 3 cho tới khi không còn trạng thái mới nào được sinh ra.

    Yêu cầu: cho biết tổng số trạng thái (số tập mục — item set) phân biệt trong tự động LR(0) chuẩn tắc thu được (bao gồm cả I0I_0I0​).

    Ví dụ: với văn phạm chỉ có 1 sản xuất S -> a, tự động LR(0) có đúng 3 trạng thái: I0={S′→⋅S, S→⋅a}I_0 = \{S' \to \cdot S,\ S \to \cdot a\}I0​={S′→⋅S, S→⋅a}, I1={S′→S⋅}I_1 = \{S' \to S \cdot\}I1​={S′→S⋅} (từ goto(I0,S)\text{goto}(I_0, S)goto(I0​,S)), I2={S→a⋅}I_2 = \{S \to a \cdot\}I2​={S→a⋅} (từ goto(I0,a)\text{goto}(I_0, a)goto(I0​,a)). Kết quả in ra: 3.

    • Định dạng đầu vào:
      • Dòng 1: số nguyên NNN — số sản xuất (1≤N≤301 \le N \le 301≤N≤30).
      • NNN dòng tiếp theo: mỗi dòng dạng LHS -> s1 s2 ... sk (nếu vế phải rỗng — sản xuất sinh ε\varepsilonε — dòng chỉ có LHS ->). Đảm bảo văn phạm đủ nhỏ để tự động LR(0) tương ứng có không quá vài trăm trạng thái.
    • Định dạng đầu ra:

      In ra đúng một dòng, là một số nguyên: tổng số trạng thái của tự động LR(0) chuẩn tắc.

    Ví dụ:

    Đầu vào:

    1
    S -> a
    

    Đầu ra:

    3
    

    Đầu vào:

    2
    S -> ( S )
    S -> id
    

    Đầu ra:

    6
    

    Đang tải editor...