Bộ phân tích cú pháp (parser) hoạt động theo từng bước; tại mỗi bước, dựa vào trạng thái hiện tại, nó xác định được tập hợp các loại token hợp lệ có thể xuất hiện tiếp theo (tương tự tập FIRST/FOLLOW trong lý thuyết văn phạm). Nếu token thực tế đọc được từ bộ phân tích từ vựng không nằm trong tập hợp lệ đó, một lỗi cú pháp được phát hiện.
Theo chiến lược báo lỗi đơn (single-error reporting) nhằm tránh lỗi dây chuyền, trình biên dịch chỉ báo cáo lỗi đầu tiên xuất hiện theo thứ tự các bước, rồi coi như đã xử lý xong (các bước sau, dù có lỗi hay không, không được báo cáo thêm).
Cho vết gồm m bước phân tích, mỗi bước gồm: token thực tế đọc được, và tập hợp các token hợp lệ được kỳ vọng tại bước đó. Hãy xác định bước đầu tiên (nếu có) mà token thực tế không thuộc tập kỳ vọng.
Ví dụ: bước có token thực tế ID, kỳ vọng {IF,WHILE} — ID không thuộc tập này, đây là lỗi cú pháp phát hiện tại bước đó. Nếu đây là bước 1, kết quả in ra là Step 1: unexpected token 'ID'.
Dòng đầu tiên chứa số nguyên m (0≤m≤2000) — số bước. m dòng tiếp theo, mỗi dòng mô tả một bước theo thứ tự, các thành phần cách nhau bởi khoảng trắng, gồm: token thực tế (một chuỗi không chứa khoảng trắng), số nguyên k (k≥0) là số token kỳ vọng, rồi k token kỳ vọng.
Nếu tồn tại bước đầu tiên (chỉ số bước i tính từ 1) có token thực tế không thuộc tập kỳ vọng của bước đó, in Step i: unexpected token 'X' với X là token thực tế của bước đó. Nếu mọi bước đều hợp lệ (kể cả khi m=0), in No syntax errors detected.
Ví dụ:
Đầu vào:
2
ID 2 IF WHILE
SEMI 1 IF
Đầu ra:
Step 1: unexpected token 'ID'
Đầu vào:
3
ID 2 ID IF
SEMI 1 SEMI
RPAREN 2 RPAREN LBRACE
Đầu ra:
No syntax errors detected
Đang tải editor...