Trong giai đoạn phân tích ngữ nghĩa, trình biên dịch quản lý các định danh bằng bảng ký hiệu (symbol table) tổ chức theo ngăn xếp phạm vi (scope stack) để hỗ trợ khai báo lồng nhau (khối lệnh trong khối lệnh) và quy tắc phạm vi tĩnh (static scoping): khi tra cứu một định danh, trình biên dịch tìm từ phạm vi trong cùng (gần nhất) ra ngoài, gặp khai báo đầu tiên thì dùng ngay khai báo đó.
Ban đầu chỉ có phạm vi toàn cục (phạm vi thứ 0). Cho một dãy lệnh, mỗi lệnh thuộc một trong bốn loại:
BEGIN — mở một phạm vi mới (đẩy vào ngăn xếp phạm vi).END — đóng phạm vi trong cùng hiện tại (rút khỏi ngăn xếp). Đề bảo đảm không có lệnh END nào được thực hiện khi ngăn xếp chỉ còn phạm vi toàn cục (phạm vi toàn cục không bao giờ bị đóng).DECL <name> <type> — khai báo định danh name với kiểu type (một chuỗi không chứa khoảng trắng) trong phạm vi hiện tại. Nếu name đã được khai báo trước đó trong đúng phạm vi hiện tại, khai báo mới ghi đè kiểu cũ (không phát sinh lỗi).USE <name> — tra cứu name theo quy tắc phạm vi tĩnh nêu trên: duyệt từ phạm vi trong cùng ra ngoài, in ra kiểu của khai báo đầu tiên tìm thấy; nếu không tìm thấy ở bất kỳ phạm vi nào, in undeclared.Ví dụ: với dãy lệnh
DECL x int
BEGIN
DECL x float
USE x
END
USE x
kết quả tra cứu lần lượt là float (dùng khai báo x kiểu float trong phạm vi trong cùng) rồi int (sau khi phạm vi đó đóng, quay lại dùng khai báo x kiểu int ở phạm vi toàn cục).
Dòng đầu tiên là số nguyên n (0≤n≤2×105) — số lệnh. n dòng tiếp theo, mỗi dòng là một lệnh thuộc một trong bốn dạng: BEGIN, END, DECL <name> <type>, USE <name>. Dữ liệu đảm bảo hợp lệ (không có END thừa).
Với mỗi lệnh USE xuất hiện, in ra đúng một dòng: kiểu tìm được, hoặc undeclared nếu không tìm thấy. Các dòng in ra theo đúng thứ tự các lệnh USE trong input. Nếu không có lệnh USE nào, không in gì cả.
Ví dụ:
Đầu vào:
12
DECL a int
BEGIN
DECL b float
BEGIN
DECL c int
USE a
USE b
USE c
END
USE c
BEGIN
DECL a bool
Đầu ra:
int
float
int
undeclared
Đầu vào:
8
DECL x int
BEGIN
DECL x float
USE x
END
USE x
BEGIN
USE y
Đầu ra:
float
int
undeclared
Đang tải editor...