Vậy trình phân tích cú pháp HTML hoạt động như thế nào? Nó không sử dụng biểu thức chính quy để phân tích cú pháp?
Ồ không.
Nếu bạn quay trở lại bộ não của mình về một khóa học lý thuyết về tính toán, nếu bạn đã tham gia một khóa học hoặc khóa học về trình biên dịch, hoặc thứ gì đó tương tự, bạn có thể nhớ lại rằng có nhiều loại ngôn ngữ và mô hình tính toán khác nhau. Tôi không đủ điều kiện để đi vào tất cả các chi tiết, nhưng tôi có thể cùng bạn xem xét một vài điểm chính.
Loại ngôn ngữ & tính toán đơn giản nhất (cho những mục đích này) là ngôn ngữ thông thường. Chúng có thể được tạo bằng các biểu thức chính quy và được nhận dạng bằng các dữ liệu tự động hữu hạn. Về cơ bản, điều đó có nghĩa là các chuỗi "phân tích cú pháp" trong các ngôn ngữ này sử dụng trạng thái, nhưng không sử dụng bộ nhớ phụ. HTML chắc chắn không phải là một ngôn ngữ thông thường. Nếu bạn nghĩ về nó, danh sách các thẻ có thể được lồng sâu tùy ý. Ví dụ: bảng có thể chứa các bảng và mỗi bảng có thể chứa nhiều thẻ lồng nhau. Với biểu thức chính quy, bạn có thể chọn ra một cặp thẻ, nhưng chắc chắn không phải bất cứ thứ gì được lồng vào nhau một cách tùy tiện.
Một ngôn ngữ đơn giản cổ điển không thông thường được kết hợp chính xác trong dấu ngoặc đơn. Cố gắng hết sức có thể, bạn sẽ không bao giờ có thể tạo một biểu thức chính quy (hoặc một tự động hóa hữu hạn) luôn hoạt động. Bạn cần có bộ nhớ để theo dõi độ sâu của tổ.
Máy trạng thái có ngăn xếp bộ nhớ là điểm mạnh tiếp theo của mô hình tính toán. Đây được gọi là một tự động đẩy xuống và nó nhận dạng các ngôn ngữ được tạo bởi các ngữ pháp không có ngữ cảnh. Ở đây, chúng ta có thể nhận ra các dấu ngoặc được khớp chính xác - thực sự, một ngăn xếp là mô hình bộ nhớ hoàn hảo cho nó.
Chà, điều này có đủ tốt cho HTML không? Thật đáng buồn không. Có thể đối với XML siêu duper đã được xác thực cẩn thận, trong đó tất cả các thẻ luôn xếp hàng hoàn hảo. Trong HTML thế giới thực, bạn có thể dễ dàng tìm thấy các đoạn mã như <b><i>wow!</b></i>
. Điều này rõ ràng là không lồng vào nhau, vì vậy để phân tích cú pháp chính xác, một ngăn xếp không đủ mạnh.
Cấp độ tính toán tiếp theo là các ngôn ngữ được tạo ra bởi các ngữ pháp chung và được các máy Turing nhận dạng. Điều này thường được chấp nhận là mô hình tính toán mạnh nhất có hiệu quả - một máy trạng thái, với bộ nhớ phụ, bộ nhớ của nó có thể được sửa đổi ở bất cứ đâu. Đây là những gì ngôn ngữ lập trình có thể làm. Đây là mức độ phức tạp của HTML.
Để tóm tắt mọi thứ ở đây trong một câu: để phân tích cú pháp HTML chung, bạn cần một ngôn ngữ lập trình thực sự, không phải một biểu thức chính quy.
HTML được phân tích cú pháp giống như cách các ngôn ngữ khác được phân tích cú pháp: lexing và phân tích cú pháp. Bước lexing chia nhỏ luồng ký tự riêng lẻ thành các mã thông báo có ý nghĩa. Bước phân tích cú pháp tập hợp các mã thông báo, sử dụng các trạng thái và bộ nhớ, thành một tài liệu mạch lạc về mặt logic có thể được thực hiện.