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] Dựng dòng ACTION theo SLR(1) và phát hiện xung đột

    Với một trạng thái (tập mục LR(0) đã đóng) III trong bảng phân tích SLR(1), hành động ACTION cho từng ký hiệu kết thúc aaa được xác định như sau (giả sử sản xuất số 1 luôn là sản xuất mở rộng S′→SS' \to SS′→S):

    • Nếu [A→α⋅a β]∈I[A \to \alpha \cdot a\,\beta] \in I[A→α⋅aβ]∈I với aaa là ký hiệu kết thúc: ACTION[a] có thể shift.
    • Nếu [A→α⋅]∈I[A \to \alpha \cdot] \in I[A→α⋅]∈I (mục đầy đủ) và A≠S′A \ne S'A=S′: với mọi a∈FOLLOW(A)a \in FOLLOW(A)a∈FOLLOW(A) (cho sẵn), ACTION[a] có thể reduce theo sản xuất A→αA \to \alphaA→α.
    • Nếu [S′→S⋅]∈I[S' \to S \cdot] \in I[S′→S⋅]∈I: ACTION[\$] là accept.

    Nếu với cùng một ký hiệu aaa, có từ hai hành động khác nhau trở lên được xác định, trạng thái III có xung đột (shift/reduce nếu một trong số đó là shift, reduce/reduce nếu tất cả đều là reduce nhưng theo các sản xuất khác nhau — một ô có thể vừa là shift/reduce vừa chứa nhiều reduce cùng lúc).

    Cho văn phạm (sản xuất 1 luôn là S′→SS' \to SS′→S), tập FOLLOWFOLLOWFOLLOW của các phi kết thúc liên quan, và một trạng thái III (tập mục đã đóng), hãy dựng dòng ACTION tương ứng và cho biết trạng thái có xung đột hay không.

    Ví dụ: với I={T→F⋅}I = \{T \to F \cdot\}I={T→F⋅} và FOLLOW(T) = \{+, *, \, )}:doˋngACTIONcoˊreducetheosảnxua^ˊt": dòng ACTION có reduce theo sản xuất ":doˋngACTIONcoˊreducetheosảnxua^ˊt"T \to F"tạicả4kyˊhiệu‘+∗" tại cả 4 ký hiệu `+ * "tạicả4kyˊ​hiệu‘+∗ )`, không có shift nên không xung đột.

    • Định dạng đầu vào:
      • Dòng 1: số nguyên nnn — số sản xuất. Sản xuất số 1 luôn là sản xuất mở rộng S′→SS' \to SS′→S.
      • nnn dòng tiếp theo: các sản xuất, định dạng A -> X1 ... Xk hoặc A -> #, đánh số 1,…,n1, \ldots, n1,…,n theo thứ tự.
      • Dòng tiếp theo: số nguyên fff — số phi kết thúc có tập FOLLOW được cho.
      • fff dòng tiếp theo: mỗi dòng dạng A: t1 t2 ... — tập FOLLOW(A)FOLLOW(A)FOLLOW(A) (các ký hiệu kết thúc cách nhau khoảng trắng; ký hiệu kết thúc chuỗi được viết là $).
      • Dòng tiếp theo: số nguyên mmm — số mục của trạng thái III.
      • mmm dòng tiếp theo: mỗi dòng một mục dạng A -> β . γ (định dạng dấu chấm như các bài trước).
    • Định dạng đầu ra:
      • Dòng 1: số nguyên ccc — số ký hiệu kết thúc có ít nhất một hành động trong ACTION.
      • ccc dòng tiếp theo, mỗi dòng ứng với một ký hiệu kết thúc có hành động, liệt kê theo thứ tự tăng dần khi so sánh chuỗi (thứ tự từ điển theo mã ASCII), dạng a: hành_động. Nếu ô có nhiều hành động (xung đột), các hành động được nối bởi dấu / theo thứ tự: shift (nếu có) trước, rồi các reduce k theo thứ tự kkk tăng dần, cuối cùng là accept (nếu có). Mỗi hành động được viết là shift, reduce k (k là số hiệu sản xuất), hoặc accept.
      • Dòng cuối cùng: OK nếu không có ký hiệu nào có từ 2 hành động trở lên, ngược lại CONFLICT.

    Ví dụ:

    Đầu vào:

    7
    E' -> E
    E -> E + T
    E -> T
    T -> T * F
    T -> F
    F -> ( E )
    F -> id
    3
    E: + $ )
    T: + * $ )
    F: + * $ )
    1
    T -> F .
    

    Đầu ra:

    4
    $: reduce 5
    ): reduce 5
    *: reduce 5
    +: reduce 5
    OK
    

    Đầu vào:

    3
    S' -> S
    S -> S + S
    S -> id
    1
    S: + $
    2
    S -> S + S .
    S -> S . + S
    

    Đầu ra:

    2
    $: reduce 2
    +: shift/reduce 2
    CONFLICT
    

    Đang tải editor...