Biểu diễn cây cú pháp của một biểu thức số học bằng ký pháp tiền tố (prefix) ngoặc lồng nhau, trong đó mỗi nút là một trong bốn dạng token (dấu ngoặc ( ) là token riêng biệt, mọi token cách nhau đúng một khoảng trắng):
- đầu), không chứa . → kiểu int, giá trị là chính nó.. → kiểu float, giá trị là chính nó.int, float hoặc bool); giá trị là không xác định (unknown) — input đảm bảo mọi định danh dùng trong biểu thức có mặt trong bảng ký hiệu.( OP L R ) với OP ∈{+,−,∗}, L, R là hai cây con (mỗi cây con cũng theo một trong bốn dạng trên).Luật ngữ nghĩa SDT (thuộc tính tổng hợp) cho một nút ( OP L R ):
type(L) hoặc type(R) là bool → cả biểu thức là lỗi kiểu (không dùng bool trong phép toán số học); lỗi lan truyền lên toàn cây (nếu một cây con là lỗi, nút cha cũng là lỗi). Ngược lại, nếu type(L) = type(R) = int thì type = int; nếu không (có ít nhất một float, không có bool) thì type = float.value(L) và value(R) đều xác định (khác unknown) thì value = value(L) OP value(R) (số học thông thường, ép về kiểu kết quả — nếu type = int thì lấy phần nguyên của kết quả, dữ liệu vào đảm bảo phép tính giữa các số nguyên luôn cho kết quả nguyên đúng); nếu value(L) hoặc value(R) là unknown (do có định danh) thì value của nút cũng là unknown.Ví dụ 1: bảng x:int, y:float, biểu thức ( + ( * x 2 ) y ): (* x 2) có type int nhưng value unknown (vì x là định danh); nút gốc có type float (vì y là float), value unknown (lan từ nhánh trái). Kết quả: float UNKNOWN.
Ví dụ 2: không có biến, biểu thức ( + ( * 2 3 ) 4.0 ): (* 2 3) = int 6; gốc = float, value = 6+4.0=10.0. Kết quả: float 10.000000.
Ví dụ 3: bảng b:bool, biểu thức ( + b 1 ): b có type bool được dùng trực tiếp làm toán hạng → lỗi kiểu. Kết quả: ERROR.
Dòng đầu tiên chứa số nguyên k (0≤k≤100) — số biến trong bảng ký hiệu.
k dòng tiếp theo, mỗi dòng name type (type ∈ {int, float, bool}).
Dòng cuối cùng là biểu thức tiền tố (mỗi token, kể cả ( và ), cách nhau đúng một khoảng trắng).
In đúng một dòng:
ERROR.TYPE value, với TYPE là int hoặc float; nếu int in nguyên dạng số nguyên, nếu float in với đúng 6 chữ số thập phân (định dạng %.6f).TYPE UNKNOWN.Ví dụ 2 ở trên cho output float 10.000000; ví dụ 1 cho float UNKNOWN; ví dụ 3 cho ERROR.
Ví dụ:
Đầu vào:
2
x int
y float
( + ( * x 2 ) y )
Đầu ra:
float UNKNOWN
Đầu vào:
0
( + ( * 2 3 ) 4.0 )
Đầu ra:
float 10.000000
Đang tải editor...