Peki bir HTML ayrıştırıcı nasıl çalışır? Ayrıştırmak için normal ifadeler kullanmıyor mu?
Hayır.
Beyninizde bir hesaplama teorisi kursuna geri dönerseniz, bir derse veya bir derleyici kursuna veya benzer bir şeye gittiyseniz, farklı dil türleri ve hesaplama modelleri olduğunu hatırlayabilirsiniz. Tüm ayrıntılara girecek nitelikte değilim, ancak birkaç önemli noktayı sizinle birlikte gözden geçirebilirim.
En basit dil ve hesaplama türü (bu amaçlar için) normal bir dildir. Bunlar normal ifadelerle oluşturulabilir ve sonlu otomatlarla tanınabilir. Temel olarak, bu, bu dillerdeki dizgelerin "ayrıştırılmasının" durum kullandığı anlamına gelir, ancak yardımcı belleği kullanmaz. HTML kesinlikle normal bir dil değildir. Bunu düşünürseniz, etiket listesi keyfi bir şekilde derinlemesine yerleştirilebilir. Örneğin, tablolar tablo içerebilir ve her tablo çok sayıda iç içe geçmiş etiket içerebilir. Normal ifadelerle, bir çift etiket seçebilirsin, ama kesinlikle keyfi olarak iç içe yerleştirilmiş hiçbir şey olamaz.
Normal olmayan klasik bir basit dil, parantezlerle doğru şekilde eşleşir. Yapabildiğiniz kadar deneyin, her zaman işe yarayacak bir düzenli ifade (veya sonlu otomat) asla oluşturamazsınız. Yuvalama derinliğini takip etmek için hafızaya ihtiyacınız var.
Bellek yığınına sahip bir durum makinesi, hesaplama modelinin bir sonraki gücüdür. Buna aşağı itmeli otomat denir ve bağlamdan bağımsız gramerler tarafından oluşturulan dilleri tanır. Burada, doğru eşleştirilmiş parantezleri tanıyabiliriz - aslında bir yığın, onun için mükemmel bir bellek modelidir.
Peki, bu HTML için yeterince iyi mi? Üzgünüm hayır. Belki de tüm etiketlerin her zaman mükemmel bir şekilde sıralandığı, dikkatlice doğrulanmış XML için olabilir. Gerçek dünya HTML'sinde, gibi parçacıkları kolayca bulabilirsiniz <b><i>wow!</b></i>
. Bu açıkça yuvalanmaz, bu yüzden doğru şekilde ayrıştırmak için bir yığın yeterince güçlü değildir.
Bir sonraki hesaplama düzeyi, genel gramerler tarafından üretilen ve Turing makineleri tarafından tanınan dillerdir. Bu genellikle var olan en güçlü hesaplama modeli olarak kabul edilir - belleği herhangi bir yerde değiştirilebilen yardımcı belleğe sahip bir durum makinesi. Programlama dillerinin yapabileceği şey budur. Bu, HTML'nin yaşadığı karmaşıklık düzeyidir.
Buradaki her şeyi tek bir cümleyle özetlemek gerekirse: genel HTML'yi ayrıştırmak için normal bir ifadeye değil gerçek bir programlama diline ihtiyacınız var.
HTML, diğer dillerin çözümlendiği şekilde çözümlenir: sözcük oluşturma ve ayrıştırma. Sözcük oluşturma adımı, bireysel karakterlerin akışını anlamlı belirteçlere böler. Ayrıştırma adımı, durumları ve belleği kullanarak simgeleri, üzerinde işlem yapılabilecek mantıksal olarak tutarlı bir belge halinde birleştirir.