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] Tra cứu một ô trong bảng phân tích LL(1)

    Bảng phân tích LL(1) là một bảng hai chiều Table[A,a]Table[A, a]Table[A,a] với AAA là non-terminal và aaa là terminal (hoặc \$$), trong đó ô Table[A,a]chứaluậtsinhchứa luật sinhchứaluậtsinhA \to \alpha(ne^ˊucoˊ)saocho(nếu có) sao cho(ne^ˊucoˊ)saochoa \in SELECT(A \to \alpha)(địnhnghı~a(định nghĩa(địnhnghı~aSELECT$ như các bài trước).

    Với văn phạm LL(1) hợp lệ, mỗi ô có TỐI ĐA một luật sinh; nhưng nếu văn phạm KHÔNG phải LL(1), một ô có thể chứa từ 2 luật sinh trở lên (xung đột). Cho một truy vấn (X,a)(X, a)(X,a) (không giả định trước văn phạm là LL(1)), hãy cho biết trạng thái của ô Table[X,a]Table[X, a]Table[X,a]:

    • Nếu không có luật sinh nào của XXX mà aaa thuộc SELECTSELECTSELECT của nó: ô rỗng.
    • Nếu có đúng một luật sinh: cho biết luật sinh đó.
    • Nếu có từ hai luật sinh trở lên (xung đột): cho biết số lượng và chỉ số các luật sinh liên quan.

    Các luật sinh được đánh số 1,2,…,n1, 2, \ldots, n1,2,…,n theo thứ tự trong input.

    Ví dụ, với văn phạm biểu thức số học kinh điển và truy vấn (Y, \):: :Ycoˊ2luậtsinh,‘Y−>∗FY‘(SELECTcó 2 luật sinh, `Y -> * F Y` (SELECTcoˊ2luậtsinh,‘Y−>∗FY‘(SELECT={*})vaˋ‘Y−>e‘(SELECT) và `Y -> e` (SELECT )vaˋ‘Y−>e‘(SELECT= FOLLOW(Y) = {), +, $});chỉluậtsinhthứhaicoˊ); chỉ luật sinh thứ hai có );chỉluậtsinhthứhaicoˊ$$ trong SELECT. Kết quả in ra: Y -> e.

    • Đị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), đánh số 1..n1..n1..n theo thứ tự.
      • nnn dòng luật sinh dạng A -> X1 X2 ... Xk (hoặc A -> e).
      • Dòng cuối cùng: truy vấn X a gồm hai token cách nhau bởi khoảng trắng — X là một non-terminal của văn phạm, a là một terminal của văn phạm hoặc ký hiệu $ (đại diện ký hiệu kết thúc đầu vào).

      Đả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 ô rỗng: in ra đúng EMPTY.
      • Nếu có đúng một luật sinh X→αX \to \alphaX→α: in ra đúng một dòng theo định dạng gốc của luật sinh, X -> Y1 Y2 ... Yk (các ký hiệu cách nhau đúng một khoảng trắng), hoặc X -> e nếu α=ε\alpha = \varepsilonα=ε.
      • Nếu có m≥2m \ge 2m≥2 luật sinh xung đột: in ra CONFLICT m i1,i2,...,im với i1<i2<…<imi_1 < i_2 < \ldots < i_mi1​<i2​<…<im​ là các chỉ số luật sinh liên quan (cách nhau bởi dấu phẩy, không khoảng trắng), và mmm cách CONFLICT cùng danh sách chỉ số bởi đúng một khoảng trắng.

    Ví dụ:

    Đầ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
    E (

    Đầu ra:

    E -> T X
    

    Đầ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
    F +

    Đầu ra:

    EMPTY
    

    Đang tải editor...