10/10/2018, 10:04
Giúp đỡ kiểm tra công thức toán học
Hi all,
Mình đang cần code xử lý để kiểm tra một chuỗi nhập vào có phải là công thức (toán học) hay ko? Mình định sử dụng RegEx để kiểm tra nhưng loay hoay mãi vẫn ko được. Có cao thủ nào về mục này không giúp mình với.
Các toán tử là (+), trừ (-), nhân (*), chia (/).
Các biến số là x, y, z.
Các hệ số đều là số nguyên.
Chú ý: Chỉ được sử dụng các ngoặc cong.
Ví dụ:
3*x + 6/y - (x + 3 * z) => Công thức đúng
3*x + (6/y - z*(x + 3 * z)) - (z/y)*(4*x) => Công thức đúng
3*x + (6/y - (x + 3 * z) => Công thức sai - thiếu ngoặc đóng
Help!!!!!!!!
Mình đang cần code xử lý để kiểm tra một chuỗi nhập vào có phải là công thức (toán học) hay ko? Mình định sử dụng RegEx để kiểm tra nhưng loay hoay mãi vẫn ko được. Có cao thủ nào về mục này không giúp mình với.
Các toán tử là (+), trừ (-), nhân (*), chia (/).
Các biến số là x, y, z.
Các hệ số đều là số nguyên.
Chú ý: Chỉ được sử dụng các ngoặc cong.
Ví dụ:
3*x + 6/y - (x + 3 * z) => Công thức đúng
3*x + (6/y - z*(x + 3 * z)) - (z/y)*(4*x) => Công thức đúng
3*x + (6/y - (x + 3 * z) => Công thức sai - thiếu ngoặc đóng
Help!!!!!!!!
Bài liên quan
Ví dụ:
3*x + 6/y - (x + 3 * z) => Công thức đúng
3*x + (6/y - z*(x + 3 * z)) - (z/y)*(4*x) => Công thức đúng
3*x + (6/y - (x + 3 * z) => Công thức sai - thiếu ngoặc đóng
http://en.wikibooks.org/wiki/Compiler_Construction
(chú trọng vào phần syntax analysis - đó là phần sẽ xử lí bài toán của bạn)
Liệu dùng RegEx có giải quyết được bài toán của mình ko nhỉ? Các cao thủ tiếp tục chỉ giúp với - Helpppppppppppp!
PHP bản thân nó là 1 chương trình có năng lực xử lý ngôn ngữ rồi, nên có thể dùng cách eval để test, biến các x y z thành $x $y $z bằng replace và eval biểu thức
eval('$x=3*$x+(6/$y-($x+3*$z);');
Theo thông tin từ PHP http://php.net/manual/en/function.eval.php thì chỉ có thể có FALSE với lỗi parse error. Suy cho cùng đây chính là lỗi ta cần tìm. Để tránh division by zero có thể cần gán trước 1 số dữ liệu nào đó ngẫu nhiên. Tất nhiên có rất nhiều vấn đề cần giải quyết với nó nhưng không đủ thời gian cho câu trả lời hoàn hảo.
Thân ái.
Regex chỉ có thể đối sánh với 1 pattern có sẵn. Bạn có thể tạo ra 1 pattern chuẩn dành cho các biểu thức toán học ko? Đừng nói tới pattern chuẩn, chỉ riêng xác định formal language và lập automat cho biểu thức toán học đã là ko dễ dàng rồi.
Bạn cần tự xây dựng cho mình 1 parser, hoặc có thể nhờ vả 1 parser có sẵn là PHP như cách mà tiendx2002 đề nghị.
Regards!
[=========> Bổ sung bài viết <=========]
Tuy nhiên đồng ý là xử lý như vậy khá rắc rối, cái ta cần có lẽ chỉ là 1 đoạn script kiểm tra tính đóng mở hợp lệ của ngoặc. Theo mình đây là lỗi thông dụng nhất và cũng khó phát hiện bằng mắt hơn các lỗi khác.
Thân ái.