Theo như xác nhận là có liên quan, các thẻ nhân vật sau đây là hợp lệ:
operator: [/*+-]
funcs: (a\(|b\()
brackets: [()]
numbers: \d+(\.\d+)?
space: [ ]
Một xác nhận đơn giản sau đó có thể kiểm tra nếu chuỗi đầu vào phù hợp với bất kỳ sự kết hợp của các mô hình. Bởi vì funcs
mã thông báo là khá chính xác và nó không mâu thuẫn nhiều với thẻ khác, xác nhận này nên được khá ổn định w/o cần thực hiện bất kỳ cú pháp/ngữ pháp đã:
Chỉ
$tokens = array(
'operator' => '[/*+-]',
'funcs' => '(a\(|b\()',
'brackets' => '[()]',
'numbers' => '\d+(\.\d+)?',
'space' => '[ ]',
);
$pattern = '';
foreach($tokens as $token)
{
$pattern .= sprintf('|(?:%s)', $token);
}
$pattern = sprintf('~^(%s)*$~', ltrim($pattern, '|'));
echo $pattern;
nếu chuỗi đầu vào toàn bộ trận đấu chống lại mẫu dựa trên mã thông báo, nó xác nhận.Nó vẫn có thể là cú pháp sai PHP, đặt bạn có thể đảm bảo nó chỉ là xây dựng dựa trên các thẻ quy định:
~^((?:[/*+-])|(?:(a\(|b\())|(?:[()])|(?:\d+(\.\d+)?)|(?:[ ]))*$~
Nếu bạn xây dựng mô hình tự động - như trong ví dụ - bạn có thể sửa đổi tokens ngôn ngữ của bạn sau này dễ dàng hơn.
Ngoài ra, đây có thể là bước đầu tiên để trình mã hóa/lexer của riêng bạn. Sau đó, luồng mã thông báo có thể được chuyển cho trình phân tích cú pháp có thể xác thực và giải thích nó. Đó là phần user187291 wrote about.
Cách khác để viết lexer + parser và bạn cần xác thực cú pháp, bạn có thể xây dựng ngữ pháp dựa trên mã thông báo và sau đó thực hiện ngữ pháp mã thông báo dựa trên mã thông báo của đầu vào.
Mã thông báo là những từ bạn sử dụng trong ngữ pháp của mình. Bạn sẽ cần phải mô tả dấu ngoặc đơn và định nghĩa hàm chính xác hơn sau đó trong mã thông báo và trình mã thông báo phải tuân thủ các quy tắc rõ ràng hơn mà mã thông báo thay thế một mã thông báo khác. Khái niệm này được nêu trong another question of mine. Nó sử dụng regex cũng như để xây dựng ngữ pháp và xác nhận cú pháp, nhưng nó vẫn không phân tích cú pháp. Trong trường hợp của bạn, eval
sẽ là trình phân tích cú pháp bạn đang sử dụng.
Bạn có quan tâm đến thứ tự của những yếu tố đầu vào đó không? – hoppa
Một ví dụ về hàm bạn sẽ cho phép và một hàm không nên vượt qua sẽ được thêm vào câu hỏi của bạn. Lưu ý việc sử dụng eval không nên được xem nhẹ. –
Đó là lý do tại sao anh ấy muốn khử trùng trước tôi nghi ngờ;) – hoppa