Luật sinh lỗi (error production) là kỹ thuật mở rộng văn phạm với các luật đặc biệt để nhận diện và "sửa" các lỗi cú pháp thường gặp ngay trong lúc phân tích. Xét biểu thức số học chỉ gồm số nguyên không âm và các toán tử + - * / (không có dấu ngoặc). Cho dãy n token, mỗi token hoặc là một số (chuỗi chữ số) hoặc là một trong bốn toán tử.
Quét token từ trái sang phải, duy trì trạng thái đang mong đợi (expect) bắt đầu là mong đợi số (N), theo luật sau:
0 ngay trước toán tử đó, rồi chấp nhận toán tử, chuyển sang mong đợi N.+ ngay trước số đó, rồi chấp nhận số, chuyển sang mong đợi O.0 vào cuối.Sau khi thu được biểu thức đã phục hồi (luôn có dạng số, toán tử, số, ..., số hợp lệ), tính giá trị của biểu thức theo đúng thứ tự ưu tiên toán học chuẩn (*, / trước, +, - sau, kết hợp trái). Nếu trong lúc tính có phép chia cho 0 (do số bị chia là 0, kể cả số 0 được chèn ảo) thì không tính được kết quả.
+ - * / (rỗng nếu n=0).In các lỗi theo đúng thứ tự phát hiện, mỗi lỗi một dòng dạng Vi tri {p}: {mô tả lỗi} với đúng ba dạng mô tả sau: thieu toan hang, da chen '0', thieu toan tu, da chen '+', hoặc thieu toan hang o cuoi bieu thuc, da chen '0' (vị trí p của lỗi cuối biểu thức là n+1).
Sau đó in: Tong so loi: {tổng số lỗi}.
Rồi in: Bieu thuc da phuc hoi: {biểu thức sau phục hồi, các token cách nhau một khoảng trắng}.
Cuối cùng in kết quả: nếu tính được, Ket qua: {giá trị} với giá trị được làm tròn và hiển thị đúng 4 chữ số thập phân; nếu có chia cho 0, in Ket qua: khong xac dinh (chia cho 0).
Ví dụ:
Đầu vào:
4
3 + * 4
Đầu ra:
Vi tri 3: thieu toan hang, da chen '0'
Tong so loi: 1
Bieu thuc da phuc hoi: 3 + 0 * 4
Ket qua: 3.0000
Đầu vào:
5
3 + 4 * 2
Đầu ra:
Tong so loi: 0
Bieu thuc da phuc hoi: 3 + 4 * 2
Ket qua: 11.0000
Đang tải editor...