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 tính LL(1) và tìm xung đột đầu tiên

    Một văn phạm phi ngữ cảnh được gọi là LL(1) nếu với mọi non-terminal AAA có từ hai luật sinh trở lên A→α1∣α2∣…A \to \alpha_1 \mid \alpha_2 \mid \ldotsA→α1​∣α2​∣…, các tập SELECT tương ứng đôi một rời nhau:

    SELECT(A→αi)∩SELECT(A→αj)=∅∀i≠jSELECT(A \to \alpha_i) \cap SELECT(A \to \alpha_j) = \emptyset \quad \forall i \ne jSELECT(A→αi​)∩SELECT(A→αj​)=∅∀i=j

    (định nghĩa SELECTSELECTSELECT như bài "Tính tập SELECT của một luật sinh"). Nếu tồn tại một cặp luật sinh vi phạm điều kiện trên, bộ phân tích dự đoán (predictive parser) không thể quyết định chọn luật sinh nào chỉ dựa vào 1 ký hiệu lookahead — đó là một XUNG ĐỘT.

    Các luật sinh được đánh số 1,2,…,n1, 2, \ldots, n1,2,…,n theo thứ tự trong input. Hãy kiểm tra văn phạm có phải LL(1) hay không; nếu KHÔNG, hãy tìm cặp chỉ số (i,j)(i, j)(i,j) với i<ji < ji<j thỏa: cùng thuộc về một non-terminal, SELECT(i)∩SELECT(j)≠∅SELECT(i) \cap SELECT(j) \ne \emptysetSELECT(i)∩SELECT(j)=∅, và iii nhỏ nhất có thể (nếu có nhiều jjj ứng với iii đó, chọn jjj nhỏ nhất).

    Ví dụ, văn phạm:

    S -> A a
    A -> a
    A -> e
    

    có FOLLOW(A)={a}FOLLOW(A) = \{a\}FOLLOW(A)={a} (từ S -> A a), nên SELECT(A→a)={a}SELECT(A \to a) = \{a\}SELECT(A→a)={a} và SELECT(A→ε)=FOLLOW(A)={a}SELECT(A \to \varepsilon) = FOLLOW(A) = \{a\}SELECT(A→ε)=FOLLOW(A)={a} — hai luật sinh (chỉ số 2 và 3) cùng chọn khi lookahead là a. Kết quả in ra: CONFLICT 2 3.

    • Định dạng đầu vào:
      • Dòng 1: ký hiệu bắt đầu SSS.
      • Dòng 2: số luật sinh nnn (1≤n≤201 \le n \le 201≤n≤20).
      • nnn dòng luật sinh dạng A -> X1 X2 ... Xk (hoặc A -> e), theo đúng thứ tự đánh số 1..n1..n1..n.

      Đảm bảo mọi non-terminal xuất hiện ở vế phải đều có ít nhất một luật sinh định nghĩa nó.

    • Định dạng đầu ra:

      Nếu văn phạm là LL(1) (không có xung đột nào), in ra đúng:

      LL(1)
      

      Ngược lại, in ra:

      CONFLICT i j
      

      với i,ji, ji,j (i<ji < ji<j) là cặp chỉ số luật sinh xung đột được chọn theo quy tắc: iii nhỏ nhất có thể trong số mọi cặp xung đột, sau đó jjj nhỏ nhất trong số các cặp có cùng iii đó.

    Ví dụ:

    Đầu vào:

    S
    4
    S -> a A
    S -> a B
    A -> p
    B -> q

    Đầu ra:

    CONFLICT 1 2
    

    Đầu vào:

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

    Đầu ra:

    LL(1)
    

    Đang tải editor...