Jadi bagaimana cara kerja parser HTML? Bukankah itu menggunakan ekspresi reguler untuk mengurai?
Tidak.
Jika Anda kembali ke otak Anda pada teori kursus komputasi, jika Anda mengambilnya, atau kursus kompiler, atau sesuatu yang serupa, Anda mungkin ingat bahwa ada berbagai jenis bahasa dan model komputasi. Saya tidak memenuhi syarat untuk membahas semua detailnya, tetapi saya dapat meninjau beberapa poin utama bersama Anda.
Jenis bahasa & komputasi yang paling sederhana (untuk tujuan ini) adalah bahasa biasa. Ini dapat dibuat dengan ekspresi reguler, dan dikenali dengan automata hingga. Pada dasarnya, itu berarti bahwa string "parsing" dalam bahasa ini menggunakan status, tetapi bukan memori tambahan. HTML tentu bukan bahasa biasa. Jika Anda memikirkannya, daftar tag dapat disarangkan secara dalam. Misalnya, tabel dapat berisi tabel, dan setiap tabel dapat berisi banyak tag bertingkat. Dengan ekspresi reguler, Anda mungkin dapat memilih sepasang tag, tetapi tentu saja tidak ada yang bertingkat secara sembarangan.
Bahasa sederhana klasik yang tidak teratur dicocokkan dengan benar dengan tanda kurung. Mencoba sekuat tenaga, Anda tidak akan pernah bisa membuat ekspresi reguler (atau robot terbatas) yang akan selalu berhasil. Anda membutuhkan memori untuk melacak kedalaman sarang.
Mesin negara dengan tumpukan untuk memori adalah kekuatan berikutnya dari model komputasi. Ini disebut robot push-down, dan ini mengenali bahasa yang dihasilkan oleh tata bahasa bebas konteks. Di sini, kita dapat mengenali tanda kurung yang cocok dengan benar - memang, tumpukan adalah model memori yang sempurna untuk itu.
Nah, apakah ini cukup bagus untuk HTML? Sayangnya tidak. Mungkin untuk XML super-duper yang divalidasi dengan hati-hati, sebenarnya, di mana semua tag selalu berbaris sempurna. Dalam HTML dunia nyata, Anda dapat dengan mudah menemukan cuplikan seperti <b><i>wow!</b></i>
. Ini jelas tidak bersarang, jadi untuk menguraikannya dengan benar, tumpukan tidak cukup kuat.
Tingkat komputasi berikutnya adalah bahasa yang dihasilkan oleh tata bahasa umum, dan dikenali oleh mesin Turing. Ini secara umum diterima sebagai model komputasi terkuat yang pernah ada - mesin status, dengan memori tambahan, yang memorinya dapat dimodifikasi di mana saja. Inilah yang bisa dilakukan bahasa pemrograman. Ini adalah tingkat kerumitan tempat tinggal HTML.
Untuk meringkas semuanya di sini dalam satu kalimat: untuk mengurai HTML umum, Anda memerlukan bahasa pemrograman yang sebenarnya, bukan ekspresi reguler.
HTML diuraikan dengan cara yang sama seperti bahasa lain diuraikan: lexing dan parsing. Langkah lexing memecah aliran karakter individu menjadi token yang bermakna. Langkah penguraian mengumpulkan token, menggunakan status dan memori, menjadi dokumen yang koheren secara logis yang dapat ditindaklanjuti.