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] Kiểm tra văn phạm có phải LL(1)

    Với mỗi luật sinh A→αA \to \alphaA→α, định nghĩa tập LỰA CHỌN SELECT(A→α)\text{SELECT}(A \to \alpha)SELECT(A→α) như sau: SELECT(A→α)=(FIRST(α)∖{ε})∪{FOLLOW(A)neˆˊu ε∈FIRST(α)∅ngược lại\text{SELECT}(A \to \alpha) = \big(\text{FIRST}(\alpha) \setminus \{\varepsilon\}\big) \cup \begin{cases}\text{FOLLOW}(A) & \text{nếu } \varepsilon \in \text{FIRST}(\alpha)\\ \emptyset & \text{ngược lại}\end{cases}SELECT(A→α)=(FIRST(α)∖{ε})∪{FOLLOW(A)∅​neˆˊu ε∈FIRST(α)ngược lại​ Văn phạm GGG (không có kí hiệu chưa kết thúc vô ích, không đệ quy trái gián tiếp gây vòng lặp vô hạn khi tính FIRST/FOLLOW) được gọi là LL(1)LL(1)LL(1) nếu và chỉ nếu: với mọi kí hiệu chưa kết thúc AAA có từ hai luật sinh A→αiA \to \alpha_iA→αi​ trở lên, các tập SELECT(A→αi)\text{SELECT}(A \to \alpha_i)SELECT(A→αi​) ĐÔI MỘT RỜI NHAU (không có kí hiệu kết thúc nào thuộc về từ hai tập SELECT của cùng AAA trở lên).

    Cho văn phạm GGG, hãy xác định GGG có phải là văn phạm LL(1)LL(1)LL(1) hay không.

    Ví dụ kinh điển KHÔNG phải LL(1)LL(1)LL(1) (mơ hồ dangling-else):

    S -> if E then S S1
    S1 -> else S
    S1 -> eps
    E -> id
    

    vì SELECT(S1→else S)={else}\text{SELECT}(S1 \to \text{else } S) = \{else\}SELECT(S1→else S)={else} và \text{SELECT}(S1 \to \varepsilon) = \text{FOLLOW}(S1) = \{else, \}$ giao nhau tại else.

    • Định dạng đầu vào:
      • Dòng đầu tiên chứa số nguyên nnn (1≤n≤2001 \le n \le 2001≤n≤200) — số luật sinh (production) của văn phạm.
      • nnn dòng tiếp theo, mỗi dòng có dạng A -> X1 X2 ... Xk (giữa A và ->, giữa -> và X1X_1X1​, giữa các XiX_iXi​ luôn có khoảng trắng); AAA là kí hiệu ở vế trái, X1,…,XkX_1,\dots,X_kX1​,…,Xk​ là các kí hiệu ở vế phải. Nếu vế phải là chuỗi rỗng ε\varepsilonε, dòng có dạng A -> eps (đúng một kí hiệu eps).
      • Một kí hiệu là kí hiệu CHƯA KẾT THÚC (nonterminal) nếu nó xuất hiện ở vế trái của ít nhất một trong nnn luật sinh; mọi kí hiệu khác xuất hiện trong văn phạm (khác eps) là kí hiệu KẾT THÚC (terminal). Kí hiệu bắt đầu (start symbol) của văn phạm là vế trái của luật sinh ở dòng đầu tiên (dòng thứ hai của input). Có thể có nhiều luật sinh cùng vế trái, nằm ở các dòng khác nhau, không nhất thiết liền kề.
      • Kí hiệu kết thúc chuỗi vào (end-of-input marker), dùng khi tính FOLLOW, được kí hiệu là $.
    • Định dạng đầu ra:

      In ra đúng một dòng: YES nếu văn phạm GGG là LL(1)LL(1)LL(1), hoặc NO nếu không phải (viết hoa toàn bộ, không có dấu câu hay khoảng trắng thừa).

    Ví dụ:

    Đầu vào:

    4
    E -> T X
    X -> + T X
    X -> eps
    T -> id

    Đầu ra:

    YES
    

    Đầu vào:

    8
    E -> T X
    X -> + T X
    X -> eps
    T -> F Y
    Y -> * F Y
    Y -> eps
    F -> ( E )
    F -> id

    Đầu ra:

    YES
    

    Đang tải editor...