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 kiểu và biên chỉ số mảng tĩnh nhiều chiều

    Xét ngôn ngữ mini có kiểu mảng nhiều chiều dạng T[n1][n2]…[nk]T[n_1][n_2]\ldots[n_k]T[n1​][n2​]…[nk​] với T∈{T\in\{T∈{int,float,bool}\}} là kiểu cơ sở và n1,…,nkn_1,\ldots,n_kn1​,…,nk​ là kích thước cố định từng chiều (đánh số chỉ số từ 000). Xét các biểu thức truy cập phần tử x[i1][i2]...[im], trong đó x là biến mảng đã khai báo và i1,…,imi_1,\ldots,i_mi1​,…,im​ là các hằng số nguyên (biết trước tại thời điểm biên dịch).

    Trình biên dịch cần kiểm tra kiểu và biên tĩnh cùng lúc:

    • Nếu mmm lớn hơn số chiều kkk của mảng: ERROR (truy cập vượt quá số chiều khai báo).
    • Nếu tồn tại jjj (1≤j≤m1\le j\le m1≤j≤m) mà ij<0i_j < 0ij​<0 hoặc ij≥nji_j \ge n_jij​≥nj​: ERROR (chỉ số vượt biên tĩnh).
    • Ngược lại, truy cập hợp lệ:
      • Nếu m=km = km=k: kiểu kết quả là TTT (một phần tử đơn).
      • Nếu m<km < km<k: kiểu kết quả vẫn là kiểu mảng con T[nm+1]…[nk]T[n_{m+1}]\ldots[n_k]T[nm+1​]…[nk​] (giữ nguyên các chiều còn lại theo đúng thứ tự, in liền không có khoảng trắng, ví dụ int[3][4]).
      • Trường hợp m=0m=0m=0: kết quả là kiểu mảng đầy đủ ban đầu.
    • Định dạng đầu vào:

      Dòng đầu là nnn — số biến mảng khai báo. nnn dòng tiếp theo dạng <tên> <T> <k> <n1> ... <nk>. Dòng tiếp theo là qqq — số truy cập cần kiểm tra. qqq dòng tiếp theo dạng <tên> <m> <i1> ... <im> (mmm có thể bằng 000, khi đó không có chỉ số nào theo sau).

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

      In ra qqq dòng, mỗi dòng là kiểu kết quả (ví dụ int, float[3], bool[2][5]) hoặc ERROR.

    Ví dụ:

    Đầu vào:

    1
    arr int 2 3 4
    3
    arr 0
    arr 1 2
    arr 2 2 3
    

    Đầu ra:

    int[3][4]
    int[4]
    int
    

    Đầu vào:

    1
    arr int 2 3 4
    1
    arr 2 3 0
    

    Đầu ra:

    ERROR
    

    Đang tải editor...