तो HTML पार्सर कैसे काम करता है? क्या यह पार्स करने के लिए नियमित अभिव्यक्ति का उपयोग नहीं करता है?
नहीं।
यदि आप अपने मस्तिष्क में गणना के पाठ्यक्रम के सिद्धांत तक वापस पहुंचते हैं, यदि आपने एक, या एक संकलक पाठ्यक्रम, या कुछ इसी तरह लिया है, तो आप याद कर सकते हैं कि विभिन्न प्रकार की भाषाएं और कम्प्यूटेशनल मॉडल हैं। मैं सभी विवरणों में जाने के लिए योग्य नहीं हूं, लेकिन मैं आपके साथ कुछ प्रमुख बिंदुओं की समीक्षा कर सकता हूं।
सबसे सरल प्रकार की भाषा और संगणना (इन उद्देश्यों के लिए) एक नियमित भाषा है। ये नियमित अभिव्यक्तियों के साथ उत्पन्न हो सकते हैं, और परिमित ऑटोमेटा के साथ पहचाने जा सकते हैं। मूल रूप से, इसका मतलब है कि इन भाषाओं में "पार्सिंग" तार राज्य का उपयोग करते हैं, लेकिन सहायक मेमोरी नहीं। HTML निश्चित रूप से एक नियमित भाषा नहीं है। यदि आप इसके बारे में सोचते हैं, तो टैग की सूची को मनमाने तरीके से गहराया जा सकता है। उदाहरण के लिए, टेबल में टेबल हो सकते हैं, और प्रत्येक टेबल में बहुत सारे नेस्टेड टैग हो सकते हैं। नियमित अभिव्यक्तियों के साथ, आप टैग की एक जोड़ी लेने में सक्षम हो सकते हैं, लेकिन निश्चित रूप से मनमाने ढंग से नेस्टेड कुछ भी नहीं।
एक क्लासिक सरल भाषा जो नियमित नहीं है, सही रूप से कोष्ठक से मेल खाती है। जितना हो सके प्रयास करें, आप कभी भी एक नियमित अभिव्यक्ति (या परिमित ऑटोमेटन) नहीं बना पाएंगे जो हमेशा काम करेगा। आपको घोंसले की गहराई का ट्रैक रखने के लिए मेमोरी की आवश्यकता होती है।
मेमोरी के लिए स्टैक के साथ एक राज्य मशीन कम्प्यूटेशनल मॉडल की अगली ताकत है। इसे पुश-डाउन ऑटोमेटन कहा जाता है, और यह संदर्भ-मुक्त व्याकरण द्वारा उत्पन्न भाषाओं को पहचानता है। यहां, हम सही ढंग से मिलान किए गए कोष्ठकों को पहचान सकते हैं - वास्तव में, एक स्टैक इसके लिए सही मेमोरी मॉडल है।
खैर, क्या यह HTML के लिए पर्याप्त है? दुख की बात है नहीं। शायद सुपर-डुपर के लिए एक्सएमएल को सावधानीपूर्वक मान्य किया गया था, वास्तव में, जिसमें सभी टैग हमेशा पूरी तरह से पंक्तिबद्ध होते हैं। वास्तविक दुनिया HTML में, आप आसानी से स्निपेट जैसे पा सकते हैं <b><i>wow!</b></i>
। यह स्पष्ट रूप से घोंसला नहीं है, इसलिए इसे सही ढंग से पार्स करने के लिए, एक स्टैक बस पर्याप्त शक्तिशाली नहीं है।
गणना का अगला स्तर सामान्य व्याकरणों द्वारा उत्पन्न भाषाएं हैं, और ट्यूरिंग मशीनों द्वारा मान्यता प्राप्त है। यह आमतौर पर प्रभावी रूप से सबसे मजबूत कम्प्यूटेशनल मॉडल होने के लिए स्वीकार किया जाता है - एक राज्य मशीन, सहायक मेमोरी के साथ, जिसकी मेमोरी को कहीं भी संशोधित किया जा सकता है। यह वही है जो प्रोग्रामिंग भाषाएं कर सकती हैं। यह जटिलता का स्तर है जहां HTML रहता है।
एक वाक्य में यहां सब कुछ संक्षेप में प्रस्तुत करने के लिए: सामान्य HTML को पार्स करने के लिए, आपको एक वास्तविक प्रोग्रामिंग भाषा की आवश्यकता है, न कि एक नियमित अभिव्यक्ति।
HTML को उसी तरह पार्स किया जाता है जैसे अन्य भाषाओं को पार्स किया जाता है: लेक्सिंग और पार्सिंग। लेक्सिंग कदम अलग-अलग पात्रों की धारा को सार्थक टोकन में तोड़ देता है। पार्सिंग चरण टोकन को इकट्ठा करता है, राज्यों और मेमोरी का उपयोग करते हुए, एक तार्किक सुसंगत दस्तावेज़ में, जिस पर कार्रवाई की जा सकती है।